“清除记忆”后窗口小部件无效

时间:2013-12-17 09:51:46

标签: android appwidgetprovider

问题是,在我使用内置任务管理器的Clean Memory / Ram之后,我的小部件停止工作。我猜这与任务管理器清理RAM的方法有关。经过大量研究和一些尝试,我发现我需要的 BroadcastReciever监听包的更改和更新: 所以我实施但是没有用,因为文件说that the Restarted / Cleared 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>

PACKAGE_REPLACED - 特别要求通知应用程序更新。

PACKAGE_RESTARTED - 当大多数内存清理程序正在清理memmory时调用。

“data”行用于监视应用于特定包的操作。

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系统重新启动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.

更新根据我的问题,无需通过完整的代码,这是简单的应用程序。我的应用程序不包含任何Activty或Service。它只包含一个带有一个按钮的小部件,它给出了toast消息。我的应用程序中只有两个类(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);
        }
    } 
 }

1 个答案:

答案 0 :(得分:0)

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

如果您向我显示设置按钮的代码,我可以为您提供更多帮助,但这是另一个问题,您可以在发布前更好地回答Google。

编辑:看起来你并不理解小部件的想法。现在你的按钮正在做的是启动小部件。这对我来说很奇怪,我不确定那里到底发生了什么...我建议你的按钮将启动一个全新的服务。该服务将显示您的祝酒词。你挑衅地不需要监听重启包广播。