Android BroadcastReceiver启动时 – 活动在后台时保持运行
我正在监视传入的短信。
我的应用程序与BroadcastReceiver完美配合。 然而,它是从一个活动工作,并希望保持BroadcastReceiver运行的时间(而不是只是当我的活动正在运行)。 
 我怎样才能做到这一点? 我已经查看了BroadcastReceiver的生命周期,但文档中提到的所有内容都是生命周期仅限于onReceive方法,而不是保持BroadcastReceiver检查传入SMS的生命周期。 
我怎样才能使这个持久?
谢谢
您需要在操作名称为android.intent.action.BOOT_COMPLETED的清单中定义一个接收者 。
 <!-- Start the Service if applicable on boot --> <receiver android:name="com.prac.test.ServiceStarter"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> 
确保还包括完整的启动权限。
 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
使用服务 ,使任何东西坚持下去。 并使用接收器接收启动事件重新启动服务,如果系统启动..
 启动时启动服务的代码。 让服务做你的工作检查短信或任何你想要的。 你需要在MyPersistingService做你自己的工作。 
 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class ServiceStarter extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent i = new Intent("com.prac.test.MyPersistingService"); i.setClass(context, MyPersistingService.class); context.startService(i); } } 
服务或启动完成不是强制性的
 事实上,你不需要实现一个Service或注册到android.intent.action.BOOT_COMPLETED 
 一些示例显示了在创build和销毁活动时如何注册/注销BroadcastReceiver 。 但是,这对于只在打开应用程序时才会使用的意图很有用(例如,Service / Activity之间的内部通信)。 
但是,如果是短信,则需要始终听取意图(而不是只在应用程序打开时)。
还有另一种方法
 您可以创build一个扩展BroadcastReceiver并通过AndroidManifest.xml注册到所需意图的class 。 这样, BroadcastReceiver将独立于您的Activity(并不取决于Activity的生命周期) 
 这样,即使您的应用程序已closures,短信到达后,您的BroadcastReceiver也会自动通知Android。 
AndroidManifest.xml中
 <?xml version="1.0" encoding="utf-8"?> <manifest> ... <uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.RECEIVE_SMS"/> <application> .... <receiver android:name=".MyCustomBroadcastReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> </application> </manifest> 
MyCustomBroadcastReceiver.java
 public class MyCustomBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(intent != null) { String action = intent.getAction(); if(action != null) { if(action.equals("android.provider.Telephony.SMS_RECEIVED")) { // DO YOUR STUFF } else if (action.equals("ANOTHER ACTION")) { // DO ANOTHER STUFF } } } } } 
笔记
 您可以将其他意图filter添加到AndroidManifest,并在同一个BroadcastReceiver处理它们。 
只有在您执行长时间任务时才启动服务。 你只需要显示一个通知或更新一些数据库,只需使用上面的代码。