问题是我使用内置的任务管理器的Clean Memory / Ram后,我的小部件停止工作.我想这与任务管理器的RAM清理方法有关.经过大量研究和尝试,我发现我需要
broadcastReciever收听包的更改和更新:
所以我实现了,但是它不起作用,因为文档说Restarted/Cleared包没有收到此广播
<receiver android:name="com.app.lab.receiver.onRestartReciever">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<action android:name="android.intent.action.PACKAGE_RESTARTED" />
<action android:name="android.intent.action.PACKAGE_DATA_CLEARED"/>
<data android:scheme="package" />
</intent-filter>
PACKAGE_REPLACED-特别是为了通知应用程序更新而调用.
PACKAGE_RESTARTED-在大多数内存清理程序正在清理内存时调用.
“数据”行用于监视应用于特定程序包的操作.
public class onRestartReciever extends broadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Todo Auto-generated method stub
Log.d("DEBUG", "onRestartReciever");//I am not getting this log on clearing memory from task manager
}
}
我试图使用虚拟服务来获取其生命周期,即检查何时调用onDestroy,但是我发现它不是一种可靠的方法,当应用程序被任务管理器杀死时,onDestroy可能不会被调用.
所以最后,我的问题是:有没有办法告诉Android系统在任务管理器或OS清理内存时重新启动appWidgets.
注意:我的窗口小部件仅包含一个启动活动的按钮,它在大多数时间都可以正常运行,但是如果OS本身清理内存或用户从任务管理器中强制执行此操作则停止响应.我已经下载了一些窗口小部件,它似乎可以正常运行清洗内存后也.
更新:对于我的问题,不需要通过完整的代码,这是简单的Application.我的申请不包含任何活动或服务.它只包含一个带有吐司消息的按钮的小部件.在我的应用程序中只有两个类(WidgetProvider和onRestartReciever).
窗口小部件类WidgetProvider.class
public class WidgetProvider extends appwidgetprovider {
private RemoteViews remoteViews;
private ComponentName watchWidget;
PendingIntent pi;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
remoteViews = new RemoteViews(context.getPackageName(),
R.layout.touchwidget);
Intent toggleClickPlayer = new Intent(context.getApplicationContext() ,WidgetProvider.class);
toggleClickPlayer.setAction("PLAYER");
PendingIntent toggleIntentPlayer = PendingIntent.getbroadcast(context,0, toggleClickPlayer,endingIntent.FLAG_CANCEL_CURRENT);
remoteViews.setonClickPendingIntent(R.id.player, toggleIntentPlayer);
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
watchWidget = new ComponentName(context,WidgetProvider.class);
remoteViews = new RemoteViews(context.getPackageName(),R.layout.touchwidget);
Toast.makeText(context, " Player started",Toast.LENGTH_SHORT).show();
(AppWidgetManager.getInstance(context)).updateAppWidget(watchWidget, remoteViews);
}
}
}
解决方法:
窗口小部件不受应用程序生命周期的约束.所有小部件都绑定在一起.如果您的窗口小部件仅有一个按钮,那么没有理由停止它.你的问题在别的地方.
由于某种原因,您的按钮意图无法启动,但您将其设置为开始.
如果您向我展示设置按钮的代码,我们将为您提供更多帮助,但这是另一个问题,在发布之前,您最好让Google为您解答.
编辑:看来您不了解小部件的想法.现在,您的按钮正在启动小部件.在我看来,这很奇怪,我不确定那里到底发生了什么…我建议您的按钮将启动一项全新的服务.该服务将向您展示烤面包.您绝对不需要收听重新启动程序包广播.