服务停止后如何处理意图?

时间:2012-07-27 08:02:52

标签: android android-intent broadcastreceiver

我是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将如何知道发送我感兴趣的意图。我假设我会错过一些活动。

我尝试将意图放入清单中,但我已阅读(并观察到)您无法将此技术用于更改电池的意图。

感谢。

3 个答案:

答案 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);
}

当你的服务意图停止时,也不要忘记取消注册