“清除内存”后小部件不起作用

Sha*_*yaz 6 android appwidgetprovider

问题是,在我使用内置的任务管理器的清理内存/内存后,我的小部件停止工作。我想这与任务管理器清理内存的方法有关。经过大量研究和一些尝试,我发现我需要BroadcastReciever 侦听包更改和更新:所以我实现了但它不起作用,因为文档说已that the 重新启动/已清除 package does not receive this broadcast

在清单文件中注册接收器:

<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>
Run Code Online (Sandbox Code Playgroud)

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



}
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用虚拟服务来获取其生命周期,即检查 onDestroy 何时被调用,但我发现它不是一种可靠的方法,当应用程序被任务管理器杀死时,可能不会调用 onDestroy。

所以最后,我的问题 当任务管理器或操作系统清理内存时,有什么方法可以告诉 android 系统重新启动 appWidgets

笔记: My widget contains only one button that launches an Activity.It works most of the time but stops responding if OS itself cleans memory or user forcefully do it from task manager.I've downloaded some of the widget it seem to continue working fine after cleaning memory also.

更新根据我的问题,不需要通过完整的代码,它是简单的应用程序。我的应用程序不包含任何活动或服务。它只包含一个带有一个按钮的小部件,它提供 toast 消息。我的应用程序中只有两个类(WidgetProvider 和 onRestartReciever),这就是它的 Widget 类 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);
        }
    } 
 }
Run Code Online (Sandbox Code Playgroud)

Ily*_*man 0

Widget 不绑定到应用程序生命周期。所有的小部件都绑定在一起。如果你的小部件只有一个按钮,那么它就没有理由停止工作。你的问题出在其他地方。由于某种原因,您的按钮意图无法启动您设置的启动项。

如果你向我展示设置按钮的代码,我可以为你提供更多帮助,但这是另一个问题,你最好在发布之前谷歌搜索答案。

编辑:看来您不理解小部件的概念。现在您的按钮正在执行的操作是启动小部件。对我来说这看起来很奇怪,我不确定那里到底发生了什么...我建议您的按钮将启动一项全新的服务。该服务将向您祝酒。您绝对不需要监听重启包广播。