如何使广播接收器永远活着? (用于电池小部件)

时间:2012-06-11 19:02:26

标签: android android-intent android-widget battery

我是Android新手。我想创建一个显示当前电池电量的小部件。阅读了几个教程后,我做了以下几点。创建了一个扩展AppWidgetProvider的类。在其onUpdate和onEnabled方法中注册了广播接收器,其意图过滤器为ACTION_BATTERY_CHANGED。在onRecieve方法中,TextView使用当前电池电量进行更新。

他们是:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[]      appWidgetIds) 
{

    ComponentName cn = new ComponentName(context, BatteryAppWidgetProvider.class);
    context.getApplicationContext().registerReceiver(this, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    appWidgetManager.updateAppWidget(cn, this.views);

}


@Override
public void onReceive(Context context, Intent intent) {

        Integer level = intent.getIntExtra("level", -1);
        this.views.setTextViewText(R.id.battery_level, level.toString() + "%");
        ComponentName cn =
            new ComponentName(context, BatteryAppWidgetProvider.class);
        AppWidgetManager.getInstance(context).updateAppWidget(cn, this.views);

    super.onReceive(context, intent);
}

@Override
public void onEnabled(Context context) {
    super.onEnabled(context);
    context.getApplicationContext().registerReceiver(this, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}

它可以工作一段时间 - 我可以在DDMS中看到它。但是经过一段时间后或者在我推出了很多其他应用程序之后。我的过程从DDMS中消失了。我认为Android只是删除它以释放更多内存。所以问题是如何避免这种情况?如何让我的过程永远活着?

2 个答案:

答案 0 :(得分:2)

如果当用户没有与小部件/应用程序交互时你想要android做什么,你应该使用服务。

Android Service

它旨在用于不需要用户交互的任务,尤其适用于反复检查的内容。不能保证操作系统最终仍然不会杀死它,但它会尽可能长时间保持活着。

答案 1 :(得分:1)

唯一可以避免这种情况的方法是,如果你启动一项服务并使用startForeground(),这将使操作系统不太可能杀死它,但不保证它不会。您还需要在通知栏中显示持续通知,表明它正在运行。

阅读服务here

总之,你不能阻止它被杀死