【发布时间】:2017-01-15 15:27:32
【问题描述】:
如果我让手机长时间放置 15 分钟,我会丢失我的接收器,但我认为它会像服务一样在被杀死记忆后继续存在。
清单:
<receiver
android:name=".WearableReceiver"
android:enabled="false">
<intent-filter>
<action android:name="com.example.johnbravado.MESSAGE_PROCESSED"/>
</intent-filter>
</receiver>
在Activity中启动接收器
ComponentName component = new ComponentName(CounterActivity.this, WearableReceiver.class);
getPackageManager()
.setComponentEnabledSetting(component,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
接收者
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
//MyConstants.getInstance().showToast("Message Rcvd");
PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
"com.example.johnbravado");
wakeLock.acquire();
// Do Work
MyConstants.getInstance().msgReqAction(intent.getIntExtra(MyConstants.BROADCAST_DATA_REQ, 0));
wakeLock.release();
}
广播发送者
String BROADCAST_ACTION_RESP = "com.example.johnbravado.MESSAGE_PROCESSED"
@Override
public void onMessageReceived(final MessageEvent messageEvent) {
nodeId = messageEvent.getSourceNodeId();
String incomingPath = messageEvent.getPath();
int incomingReq = Integer.parseInt(new String(messageEvent.getData()));
if(incomingPath.equalsIgnoreCase(MyConstants.MSG_COUNTER_REQ_PATH)) {
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(BROADCAST_ACTION_RESP);
broadcastIntent.putExtra(MyConstants.BROADCAST_DATA_REQ, incomingReq);
sendBroadcast(broadcastIntent);
}else if(incomingPath.equalsIgnoreCase(MyConstants.MSG_DEFAULT_PATH)){
}
}
让这种情况持续很长时间的唯一方法是调用服务
wearableReceiverIntent = new Intent(this, WearableReceiverService.class);
if(!WearableReceiverService.isRunning())
startService(wearableReceiverIntent);
服务
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Let it continue running until it is stopped.
IntentFilter filter = new IntentFilter(MyConstants.BROADCAST_ACTION_RESP);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new WearableReceiver();
registerReceiver(receiver, filter);
Notification notification = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_notif_bible)
.setContentText("Preaching").build();
startForeground(MyConstants.NOTIF_COUNTING_SERVICE, notification);
isRunning = true;
return START_STICKY;
}
如果我运行该服务,它会持续很长时间,但考虑到我每 10 分钟只交互一次,它会不必要地耗尽电池。我的印象是广播接收器会像服务一样工作,除了短时间的工作。如果您需要执行较长的操作,请调用该服务。
【问题讨论】:
-
请详细解释,“我失去了我的接收者”是什么意思,以及您是如何确定这一点的。
-
它不再执行接收者的 onReceived 内的行为。
-
您何时/如何通过
PackageManager禁用该组件?另外,您确定在 15 分钟后不会调用onReceive()吗?你是如何验证的? -
我有一个 start() 和一个 stop()。在 start() 中,我启用了接收器和我想使用上面的代码运行的服务。在 stop() 中,我禁用它。我相信它没有被调用,因为直到 android 为内存而杀死它之前它工作正常。更好的测试是输出到日志文件,看看我是否输入了它。但我不知道如何访问这些日志文件。除非这就是 logcat 应用程序的用途?
标签: android android-service android-broadcastreceiver