android - 当新的短信到达时启动广播接收器

标签 android sms broadcastreceiver

我创建了一个远程服务,它正在调用一个广播接收器,该接收器又调用警报管理器来触发警报,但我想在新消息到达时通过 rempte 服务触发接收器

这段代码如下:

     @Override
                public IBinder onBind(Intent arg0) {
                    Log.d(getClass().getSimpleName(), "onBind()");

                    return myRemoteServiceStub;
                }           

                    private IMyRemoteService.Stub myRemoteServiceStub = new IMyRemoteService.Stub() {
                        public int getCounter() throws RemoteException {
                //          startAlarmNotification();

                            IntentFilter filter = new IntentFilter();
                            filter.addAction("android.provider.Telephony.SMS_RECEIVED");
                            filter.addAction(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED);
                            filter.addAction("your_action_strings"); //further more
                            filter.addAction("your_action_strings"); //further more

                            registerReceiver(receiver, filter);
                            return counter;
                        }
                    };

                    @Override
                    public void onCreate() {
                        super.onCreate();
                        Log.d(getClass().getSimpleName(),"onCreate()");
                    }

                    @Override
                    public void onDestroy() {
                        super.onDestroy();
                        serviceHandler.removeCallbacks(myTask);
                        serviceHandler = null;
                        Log.d(getClass().getSimpleName(),"onDestroy()");
                    }

                    @Override
                    public void onStart(Intent intent, int startId) {
                        super.onStart(intent, startId);
                        serviceHandler = new Handler();
                        serviceHandler.postDelayed(myTask, 1000L);
                        Log.d(getClass().getSimpleName(), "onStart()");
                    }

                    class Task implements Runnable {
                        public void run() {
                            ++counter;
                            serviceHandler.postDelayed(this,1000L);
                            Log.i(getClass().getSimpleName(), "Incrementing counter in the run method");
                        }
                    }
                    public void  startAlarmNotification(){
                      Calendar calendar = Calendar.getInstance();
                      calendar.add(Calendar.MINUTE, 1);
                      Intent alarmintent = new Intent(RemoteService.this, AlarmReciver.class);
                      PendingIntent sender = PendingIntent.getBroadcast(this, notificationId, alarmintent,PendingIntent.FLAG_UPDATE_CURRENT | Intent.FILL_IN_DATA);
                      AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
                //        am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),  60 * 1000, sender);
                          am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
                    }


                    private final BroadcastReceiver receiver = new BroadcastReceiver() {
                           @Override
                           public void onReceive(Context context, Intent intent) {
                              String action = intent.getAction();
                              if(action.equals("android.provider.Telephony.SMS_RECEIVED")){
                                //action for sms received
                                        startAlarmNotification();
                                        unregisterReceiver(receiver);


                              }
                              else if(action.equals(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED)){
                                   //action for phone state changed
                              }     
                           }
                        };

最佳答案

如果您的服务正在运行,您的代码就可以正常工作...所以只要您收到短信,下面的代码就会运行。您可以像在收到短信后那样修改它,您可以启动服务并将您的代码放入服务中。

SmsReceiver JAVA 类

    public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

           Bundle extras = intent.getExtras();
           if (extras == null)
           return;

          // To display a Toast whenever there is an SMS.
           Toast.makeText(context,"Recieved",Toast.LENGTH_LONG).show();

           Object[] pdus = (Object[]) extras.get("pdus");
           for (int i = 0; i < pdus.length; i++) {
              SmsMessage SMessage = SmsMessage.createFromPdu((byte[]) pdus[i]);
              String sender = SMessage.getOriginatingAddress();
              String body = SMessage.getMessageBody().toString();
              Toast.makeText(context, ""+sender+":"+body , Toast.LENGTH_SHORT)
                        .show();

            }
           startAlarmNotification();
         }

        public void  startAlarmNotification(){
                      Calendar calendar = Calendar.getInstance();
                      calendar.add(Calendar.MINUTE, 1);
                      Intent alarmintent = new Intent(RemoteService.this, AlarmReciver.class);
                      PendingIntent sender = PendingIntent.getBroadcast(this, notificationId, alarmintent,PendingIntent.FLAG_UPDATE_CURRENT | Intent.FILL_IN_DATA);
                      AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
                //        am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),  60 * 1000, sender);
                          am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
                    }
     }

在您的 list 中执行以下代码:

<receiver android:name=".SmsReceiver">
                <intent-filter>
                    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                </intent-filter>
            </receiver>

同时添加以下权限:

<uses-permission android:name="android.permission.RECEIVE_SMS" />

关于android - 当新的短信到达时启动广播接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15607953/

相关文章:

android - 短信类型常量

sms - 内容 ://sms/inbox query

android - 想要在 OnReceive() 中创建通知时出错

android - 何时注销在 onCreate 中注册的广播接收器?

android - 如何将通知设置 Activity 添加到系统设置

android - 你如何根据 SQLite 文档调整 Android 的 SQLite,例如杂注缓存大小?

android - 短信接收没有通知android 4.4.2

android - 应用程序关闭时警报管理器不工作

php - android json 发布到 php

android - 在 fragment android 上按下后退按钮?