我正在监控收到的短信。
我的应用与BroadcastReceiver
完美配合。但是它正在从一个Activity开始工作,并希望BroadcastReceiver
始终保持运行(而不仅仅是在我的Activity运行时)。
我怎样才能做到这一点?我查看了BroadcastReceiver
的生命周期,但文档中提到的所有内容都是生命周期仅限于onReceive
方法,而不是保持BroadcastReceiver
检查的生命周期来电短信。
我怎样才能坚持这个?
由于
答案 0 :(得分:139)
您需要在清单中使用操作名称 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"/>
使用Service 来保持任何效果。如果系统启动,则使用接收器接收Boot Up事件以重新启动服务..
启动时启动服务的代码。 Make Service负责检查短信或任何你想要的东西。你需要在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);
}
}
答案 1 :(得分:7)
服务或引导已完成不是强制性的
事实上,您无需实施Service
或注册android.intent.action.BOOT_COMPLETED
一些示例显示了在创建和销毁活动时如何注册/取消注册BroadcastReceiver
。但是,这对于仅在打开应用程序时期望的意图(例如,用于Service / Activity之间的内部通信)非常有用。
但是,如果是短信,您希望始终收听意图(而不仅仅是在打开应用时)。
还有另一种方式
您可以创建class
扩展BroadcastReceiver
并通过AndroidManifest.xml
注册到所需的意图。这样,BroadcastReceiver
将独立于您的活动(并且不会依赖于活动的生命周期)
这样,即使您的应用已关闭,只要短信到达,您的BroadcastReceiver
会自动通知。
<强>的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
}
}
}
}
}
备注
您可以将其他意图过滤器添加到AndroidManifest,并在同一BroadcastReceiver
中处理所有这些过滤器。
仅在执行长任务时启动服务。您只需要显示通知或更新某个数据库,只需使用上面的代码即可。
答案 2 :(得分:1)
在清单中添加广播接收者:
<receiver android:name=".BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
创建类BootReciever.java
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
// +++ Do Operation Here +++
}
}
}
答案 3 :(得分:0)
在@Javanator
旁边,我想提供一个(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
的Android版本保护套。就我而言,这适用于Android SDK 29(10)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(new Intent(context,FloatingWindow.class));
} else {
context.startService(new Intent(context, FloatingWindow.class));
}
答案 4 :(得分:0)
使用此代码,并还要提及清单中的广播:
// How bikes are shown
for s in fietshare.stands {
lbAvailable.text = "Available Bikes: " + String(s.bikes.count)
nrOfAvailable.text = String(b.distance) + "M"
}