Android 服务中的广播接收器,但一旦进程终止,不会在服务中被捕获

Android 服务中的广播接收器,但一旦进程终止,不会在服务中被捕获,android,service,android-widget,broadcastreceiver,android-broadcast,Android,Service,Android Widget,Broadcastreceiver,Android Broadcast,我有一个简单的小部件,在屏幕打开时进行一些计算,并显示它们,在屏幕关闭时清除所有字段。。。我在我的服务中设置了一个广播接收器,可以收听动作屏幕的打开和关闭 只要手机没有长时间处于睡眠状态,或者手机使用率很高,这项功能就可以正常工作-一旦发生这种情况,我的小部件进程将被终止(服务仍在运行,但进程将被终止)在此之后,当屏幕关闭并返回到我的小部件上时,不会更新,因为我的服务未捕获操作\u屏幕\u打开意图:( 有时,当android系统没有声明widget进程时,widget可以正常工作数天,并在ACT

我有一个简单的小部件,在屏幕打开时进行一些计算,并显示它们,在屏幕关闭时清除所有字段。。。我在我的服务中设置了一个广播接收器,可以收听动作屏幕的打开和关闭

只要手机没有长时间处于睡眠状态,或者手机使用率很高,这项功能就可以正常工作-一旦发生这种情况,我的小部件进程将被终止(服务仍在运行,但进程将被终止)在此之后,当屏幕关闭并返回到我的小部件上时,不会更新,因为我的服务未捕获操作\u屏幕\u打开意图:(

有时,当android系统没有声明widget进程时,widget可以正常工作数天,并在ACTION屏幕上完美地显示值

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

我假设广播接收发生在主进程上,因此当进程终止时,它不会接收广播接收

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

我同意@commonware的观点,即在bg中随时运行一个服务来检测屏幕何时打开和关闭是一个非常坏的主意。你真的需要
操作屏幕打开
,还是将
操作用户在场
(手机解锁)这样,您根本不需要服务,只需在清单中定义接收方即可

如果你真的想注册,你可以在你的
ACTION\u USER\u PRESENT
接收器中注册你的服务/
ACTION\u SCREEN\u OFF
接收器,这样服务只在用户实际使用设备时才运行


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

运行服务的屏幕截图每天每时每刻都用服务占用内存,这样你就可以知道屏幕何时打开或关闭,这对用户是有害的。在Android开发中,始终运行服务是一种反模式。请为您认为正在解决的任何问题找到其他解决方案。如果我在widget类中有广播接收器,则屏幕打开的意图永远不会传递给widgetCorrect。解决方案是停止尝试接收屏幕关闭和屏幕打开广播。这些是专为前台应用程序使用而设计的*,不是应用程序小部件。感谢Commonware,我重新查看并更改了我的设计。但我仍然很好奇,为什么如果我的服务仍在运行,它不会检测到屏幕出现??是不是小部件的进程被终止了,因此服务无法接收广播??:我实际上想出了一个新的解决方案我的问题,但在阅读了你的答案后,我尝试在我的小部件中使用ACTION\u SCREEN\u ON,但它在小部件中没有接收广播。为了确保我的代码正确,我只需将其放入空白应用程序中,捕捉ACTION\u SCREEN\u ON并将其显示为祝酒词。它在应用程序中工作正常,但在小部件中不起作用:s
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();

    }
    }

    }