【问题标题】:Widget does not works after “Clear Memory”“清除内存”后小部件不起作用
【发布时间】:2013-12-17 09:51:45
【问题描述】:

问题是我使用内置任务管理器的清理内存/内存后,我的小部件停止工作。我猜这与任务管理器清理内存的方法有关。经过大量研究和一些尝试,我发现我需要的 BroadcastReciever 监听包的变化和更新: 所以我实现了但它不起作用,因为文件说that theRestarted/Clearedpackage 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 - 在大多数内存清理程序清理内存时调用。

“数据”行用于监控应用到特定包的操作。

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.

更新对于我的问题来说,不需要通过完整的代码,它是简单的应用程序。我的应用程序不包含任何活动或服务。它只包含一个带有一个按钮的小部件,它提供吐司消息。我的应用程序中只有两个类(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);
        }
    } 
 }

【问题讨论】:

    标签: android appwidgetprovider


    【解决方案1】:

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

    如果您向我展示设置按钮的代码,我可以为您提供更多帮助,但这是另一个问题,您最好在发布之前通过 Google 获得答案。

    编辑:您似乎不了解小部件的概念。现在你的按钮正在做的是启动小部件。这对我来说看起来很奇怪,我不确定那里到底发生了什么......我建议你的按钮将启动一个全新的服务。该服务将显示您的吐司。你绝对不需要监听重启包广播。

    【讨论】:

    • 我已经用我的应用程序的完整 java 代码更新了我的问题。我的应用程序不包含任何 Activty 或服务。它只包含一个带有一个按钮的小部件,它提供 toast 消息。我的应用程序中只有两个类(WidgetProvider 和 onRestartReciever),就是它 Widget 类
    • 有几个与小部件相关的问题code.google.com/p/android/issues/detail?id=28216
    • 我的小部件一直工作正常,除了清理内存之后。按钮从 OnUpdate 广播一个事件,它调用我的 Appwidgetprovider 的 onReceive 。我的小部件没有启动小部件(你说)它正在广播一个事件.我认为你没有通过我的代码
    • 如果 AppwidgetProvider 类本身包含 onReceive ,为什么还要使用服务 ..如果可以通过 onReceive 方法处理,为什么不必要创建另一个服务类..这只是一个吐司消息
    • @ShakeebAyaz 因为 AppWidgetProvider 不是服务,甚至不是上下文。它只是一个广播接收器。而且它不能用于这样的提议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2020-04-05
    • 2015-10-30
    相关资源
    最近更新 更多