2011-04-21 60 views
0

我现在正在为Android编写电池控件。但问题是,我在我的服务中注册了两个BroadcastReceivers。我开始我的AppWidgetProvider的onEnable()方法的服务,并停止onDisable()。该服务旨在监听电池状态更新和方向更改,并通过将我的自定义Intent发送到我的AppWidgetProvider来通知widget更新自身。由于广播(battery_state_changed和configuration_changed)无法由普通AppWidgetProvider接收,并且AppWidgetProvider无法注册BroadcastReceivers本身。BroadcastReceiver不时在我的服务中工作,为什么?

这一切正常工作一两天。但有时候,当电池状态发生改变时,小部件并没有自行更新,似乎我服务中的接收器无法工作,或者定制Intent突然成功停止到达我的AppWidgetProvider。

任何想法为什么会发生这种情况?

package com.carllee.widgets.kittenbatterywidget; 

import android.app.Service; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.IBinder; 

public class BatteryStateMoniterService extends Service { 
    private static final String TAG = "BatteryStateMoniterService"; 
    private BatteryStateReceiver batteryStateReceiver; 
    private OrientationChangeReceiver orientationChangeReceiver; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Logger.log(TAG, "onCreate"); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (batteryStateReceiver == null) { 
      this.unregisterReceiver(batteryStateReceiver); 
     } 
     if (orientationChangeReceiver == null) { 
      this.unregisterReceiver(orientationChangeReceiver); 
     } 
     Logger.log(TAG, "onDestroy"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     if (batteryStateReceiver == null) { 
      registerBatteryStateReceiver(); 
     } 

     if (orientationChangeReceiver == null) { 
      registerOrientationChangeReceiver(); 
     } 
     Logger.log(TAG, "onStartCommand"); 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    private void registerBatteryStateReceiver() { 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_BATTERY_CHANGED); 
     filter.addAction(Intent.ACTION_BATTERY_LOW); 
     filter.addAction(Intent.ACTION_BATTERY_OKAY); 
     batteryStateReceiver = new BatteryStateReceiver(); 
     this.registerReceiver(batteryStateReceiver, filter); 
    } 

    private void registerOrientationChangeReceiver() { 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); 
     orientationChangeReceiver = new OrientationChangeReceiver(); 
     this.registerReceiver(orientationChangeReceiver, filter); 
    } 

} 

回答

0

那么,对于一个声明:

if (batteryStateReceiver == null) { 
     this.unregisterReceiver(batteryStateReceiver); 
    } 
    if (orientationChangeReceiver == null) { 
     this.unregisterReceiver(orientationChangeReceiver); 
    } 

没有任何意义。每次你会得到NullPointerException。改变==!=;)

此外,看到的是,在背景长时间(出于需要运行的复杂服务的my post about keeping background services alive.

例)调用startForeground()。但是,它仍然可以被系统或用户杀死。

+0

是的,谢谢你,但是startForeground()需要一个Notification参数,这会在状态栏中发出一个通知(如果我没有记错的话),应用程序小部件每次都会发出通知没有任何意义它被添加到启动器。有没有更好的解决方案来阻止我的服务被杀?或者我应该只传递null来startForeground()?或者有什么办法可以阻止状态栏中显示通知? – CarlLee 2011-04-22 03:19:48

+1

嗨,我找到了一个解决方案,似乎工作,不知道它是否有效,我还在测试。解决方法是调用“setForeground(true);” ,这将服务设置为前台,而​​不在状态栏中显示任何消息。 – CarlLee 2011-04-22 05:41:44

相关问题