我有一个简单的小部件,它会在屏幕打开后进行一些计算并显示它们,并在屏幕关闭后清除所有字段……我的服务中有一个广播接收器设置,它监听 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 个服务
我假设广播接收发生在主进程上,因此当进程被杀死时它没有接收到它。
我有一个解决方法,但真的很想解决这个问题。非常感谢任何帮助