0

我有一个简单的小部件,它会在屏幕打开后进行一些计算并显示它们,并在屏幕关闭后清除所有字段……我的服务中有一个广播接收器设置,它监听 ACTION_SCREEN_ON 和 ACTION_SCREEN_OFF。

只要手机长时间不进入睡眠状态或手机使用量很大,这就会完美地工作 - 一旦发生这种情况,我的小部件进程就会被终止(服务仍在运行但进程被终止)之后这当屏幕熄灭并重新出现在我的小部件上时不会更新,因为我的服务没有捕获 ACTION_SCREEN_ON 意图:(

public class CDTservice extends Service {

  @Override
   public void onCreate() {


        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        m_receiver = new ScreenBroadcastReceiver();
        registerReceiver(m_receiver, filter);
        Log.d("Widgettool", "works");
    }



  @Override
   public int onStartCommand(Intent intent, int flags, int startId) {


start();
Toast.makeText(getBaseContext(), "SERVICE ON", Toast.LENGTH_SHORT).show();

return START_REDELIVER_INTENT;
    }


     @Override
     public void onDestroy() {
 stop();
      unregisterReceiver(m_receiver);
      }



     public void start()
       { 
RemoteViews View = new RemoteViews(this.getPackageName(), R.layout.main);   
updatewidgetclass x= new updatewidgetclass(this, View, widgetId);
x.start(); // does calculations and displays on widget
     }


      public void stop()
   {   
RemoteViews Viewclear = new RemoteViews(this.getPackageName(), R.layout.main);

updatewidgetclass y = new updatewidgetclass(this, Viewclear, widgetId);
y.stop(); // clears resources and stops

}


   private class ScreenBroadcastReceiver extends BroadcastReceiver {

     @Override
    public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
        Log.d("ON SCREEN ON", "might hang here");   
        start();


     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
       stop();

    }
    }

    }

有时,当 android 系统未声明小部件进程时,小部件可以完美运行数天并完美显示值 ACTION_SCREEN_ON

当问题出现时 - 我检查设置>应用程序>运行 - 我可以看到我的小部件名称,它显示 0 个进程和 1 个服务

我假设广播接收发生在主进程上,因此当进程被杀死时它没有接收到它。

我有一个解决方法,但真的很想解决这个问题。非常感谢任何帮助

4

1 回答 1

0

我同意@CommonsWare 的观点,即始终在 bg 中运行服务只是为了检测屏幕何时打开和关闭是一个非常糟糕的主意。你真的需要ACTION_SCREEN_ON,还是ACTION_USER_PRESENT(手机解锁)就足够了?这样,您根本不需要服务,您只需在清单中定义接收器即可。

如果您真的想要,您可以ACTION_SCREEN_OFF在您的接收器中注册您的服务/接收器,ACTION_USER_PRESENT以便该服务仅在用户实际使用设备时运行。

我知道这并不能真正回答您的问题,但它确实为您的问题提供了有用的解决方法。

于 2013-05-23T13:04:34.130 回答