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
处理它们。
只有在您执行长时间任务时才启动服务。 你只需要显示一个通知或更新一些数据库,只需使用上面的代码。