我有一个简单的小部件,一旦屏幕出现就进行一些计算并显示它们并在屏幕关闭后清除所有字段...我的服务中有一个广播接收器设置,它监听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
问题出现时 - 我检查设置> apps>运行 - 我可以看到我的小部件名称,它说0个进程和1个服务
我假设广播接收发生在主进程上,因此当进程被杀时它没有收到它。
我为此做了一些工作,但我真的想解决这个问题。 任何帮助都非常感谢
答案 0 :(得分:0)
我同意@CommonsWare一直在bg中运行服务只是为了检测屏幕何时打开和关闭是一个非常坏主意。你真的需要ACTION_SCREEN_ON
,还是ACTION_USER_PRESENT
(手机解锁)就足够了?这样,您根本不需要服务,只需在清单中定义接收器即可。
如果您真的想要,可以在ACTION_SCREEN_OFF
接收器中注册您的服务/ ACTION_USER_PRESENT
接收器,以便该服务仅在用户实际使用该设备时运行。
我知道这并没有真正回答你的问题,但它确实为你的问题提供了一个有用的解决方法。