从主屏幕删除小部件时如何停止服务

时间:2012-01-10 23:29:06

标签: android service widget

我的服务有问题。我正在尝试做一个简单的电池级小部件,但问题是我不知道如何从主屏幕移除小部件时停止服务。

这是我的服务类

public class batteryService扩展服务{

AppWidgetManager widgetManager;
private RemoteViews remoteViews;
private ComponentName thisWidget;

private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        widgetManager = AppWidgetManager.getInstance(context);
        remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
        thisWidget = new ComponentName(context, Widget.class);

        int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)*100;
        int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
        float value = (float)level/scale;
        remoteViews.setTextViewText(R.id.widget_textview, String.valueOf(value));
        widgetManager.updateAppWidget(thisWidget, remoteViews);
    }

};

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onCreate() {
    this.registerReceiver(mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    super.onCreate();
}

@Override
public void onDestroy() {
    this.unregisterReceiver(mBatInfoReceiver);
    super.onDestroy();
}

}

和这里的widget类

public class Widget extends AppWidgetProvider{
    private AppWidgetManager widget_manager;
    private RemoteViews remoteViews;
    private ComponentName thisWidget;
    private Intent intent;

    @Override
    public void onEnabled(Context context) {
        if(intent == null)
        {
            intent = new Intent(context, batteryService.class);
            context.startService(intent);
        }
        super.onEnabled(context);
    }

    @Override
    public void onDisabled(Context context) {
        if(intent != null)
        {
            context.stopService(intent);
            intent = null;
        }       
        super.onDisabled(context);
    }


}

当我从屏幕上删除小部件时,该服务仍然是实时的。我试图将onDisable改为onDeleted方法,但它没有改变任何东西。

对我有任何提示吗?

2 个答案:

答案 0 :(得分:0)

确保您在清单中为已禁用的事件采取了相应的操作:

<action android:name="android.appwidget.action.APPWIDGET_DISABLED" />

对于APPWIDGET_ENABLED的{​​{1}}元素,这将与您现有的APPWIDGET_UPDATE以及经典<receiver>操作一起使用。

此外,请考虑不要经常运行您的服务,而是使用AppWidgetProvider每隔几分钟更新一次电池信息。电池电量根本不会改变,因此必须始终尝试将服务保留在内存中。

答案 1 :(得分:0)

尝试使用onDeleted(Context, int[])