0

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

我尝试将意图放在清单中,但我已经阅读(并观察到)您不能将该技术用于电池更换意图。

谢谢。

4

3 回答 3

0

好的,首先,如果你想让你的服务保持活力,你必须WakeLockPowerManagerin获取 aonCreate()并在onDestroy().

http://developer.android.com/reference/android/os/PowerManager.html

操作系统有时可能仍会破坏并重新创建您的服务,但您不必担心它会长时间停止。(startForeground()也不能保证,Service例如,在您应用钥匙锁后您会活着。)

如果您的服务被破坏,那么操作系统仍然会触发Intents您只是看不到它们。

于 2012-07-27T08:12:48.590 回答
0

Intent 是 Android 中一种特殊的后期绑定机制。广播接收器、活动和服务在系统中注册意图过滤器,当一个意图被触发时,系统会激活可以处理这个意图的组件。因此,如果在系统中注册了一个意图过滤器,您的组件将被调用。如果系统中有静态意图过滤器(在 AndroidManifest.xml 中声明的那些),Android 操作系统会在系统启动期间注册。如果是动态意图过滤器(在广播接收器的代码中声明),您需要在启动后注册它们。因此,您可以为 onBoot 事件声明意图过滤器,并在此广播接收器中声明您的动态意图。

于 2012-07-27T08:15:34.750 回答
0

关于您的服务被杀死并重新启动,这在android中是正常的,尤其是在内存不足的情况下。ACTION_BATTERY_CHANGED 不能放在清单中,但 ACTION_SCREEN_ON/OFF 可以。因此,您已经放入了一个 Service 并确保您的事件接收器正在运行,将 register 放入 onCreate() 方法中:

public void onCreate() {
    super.onCreate();

    // battery
    registerReceiver(mBatteryInfoReceiver, new IntentFilter(
        Intent.ACTION_BATTERY_CHANGED));
    ...
}

public void onDestroy() {
    super.onDestroy();

    unregisterReceiver(mBatteryInfoReceiver);
}

当您的服务打算停止时,也不要忘记取消注册

于 2012-07-27T08:30:19.993 回答