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处理它们。

只有在您执行长时间任务时才启动服务。 你只需要显示一个通知或更新一些数据库,只需使用上面的代码。