我是Android编程的新手,所以这些可能是愚蠢的问题。我做了一些阅读但却无法得到答案。
我有一个广播接收器,其中有一些意图从服务注册 -
receiver = new EventHandler();
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); // for calls
registerReceiver(receiver, filter);
因为我已经删除了“setForeground”调用,所以我保持服务运行(因为我不想要状态栏图标,我想知道我是否对这种方法很懒),我的服务现在会被定期杀死,并且通常会在很短的时间后再次开始(但有时我看到它是5分钟)。
问题 - 因为我已经以编程方式注册了我的意图,如果我的进程恰好处于停止状态,Android将如何知道发送我感兴趣的意图。我假设我会错过一些活动。
我尝试将意图放入清单中,但我已阅读(并观察到)您无法将此技术用于更改电池的意图。
感谢。
答案 0 :(得分:0)
首先,如果您想让服务保持活跃状态,您必须从WakeLock
中的PowerManager
获取onCreate()
并在onDestroy()
中发布。
http://developer.android.com/reference/android/os/PowerManager.html
操作系统有时可能会破坏并重新创建您的服务,但您不必担心它会在较长时间内停止运行。 (startForeground()
也不保证,例如,在应用键锁之后,Service
将保持活跃状态。)
如果您的服务被销毁,那么操作系统仍会触发Intents
,您将看不到它们。
答案 1 :(得分:0)
Intent是Android中一种特殊的后期绑定机制。广播接收器,活动和服务在系统中注册意图过滤器,并且当触发意图时,系统激活可以处理该意图的组件。因此,如果在系统中注册了intent过滤器,则将调用您的组件。如果系统中有静态intent-filters(那些在AndroidManifest.xml中声明的那些),则Android OS会在系统启动期间进行注册。如果是动态intent-filters(在广播接收器的代码中声明),则需要在引导后注册它们。因此,您可以为onBoot事件声明intent-filter,在此广播接收器中,您可以声明动态意图。
答案 2 :(得分:0)
关于你的服务被杀死和重启,在android中是正常的,特别是当内存不足时。 ACTION_BATTERY_CHANGED不能放入清单,但ACTION_SCREEN_ON / OFF可以。 所以你已经放入了一个服务并确保你的事件接收器正在运行,将寄存器放在onCreate()方法中:
public void onCreate() {
super.onCreate();
// battery
registerReceiver(mBatteryInfoReceiver, new IntentFilter(
Intent.ACTION_BATTERY_CHANGED));
...
}
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mBatteryInfoReceiver);
}
当你的服务意图停止时,也不要忘记取消注册