Android AppWidget onClick在垃圾回收后不工作

Android AppWidget onClick在垃圾回收后不工作,android,android-appwidget,appwidgetprovider,Android,Android Appwidget,Appwidgetprovider,我为我的应用程序创建了一个AppWidget,并将updatePeriodMillis设置为0, 因为这个小部件没有做任何事情,如果用户没有交互的话 一切正常,直到安卓清理内存。然后小部件将不再响应,直到应用程序再次启动或设备重新启动(在这两种情况下,onUpdate()将再次运行) 所以我的问题是:在Android退出应用程序后,我需要做什么才能让它恢复工作 这是清单的一部分: <receiver android:name="WidgetProvider" >

我为我的应用程序创建了一个AppWidget,并将updatePeriodMillis设置为0, 因为这个小部件没有做任何事情,如果用户没有交互的话

一切正常,直到安卓清理内存。然后小部件将不再响应,直到应用程序再次启动或设备重新启动(在这两种情况下,onUpdate()将再次运行)

所以我的问题是:在Android退出应用程序后,我需要做什么才能让它恢复工作

这是清单的一部分:

    <receiver android:name="WidgetProvider" >
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="PATH.widgetBtnStartClicked" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
                   android:resource="@xml/appwidget_provider_info" />
    </receiver>

这是我的WidgetProvider的一部分:

public class WidgetProvider extends AppWidgetProvider {

private static final String BTN_START_CLICKED = "PATH.widgetBtnStartClicked";


private static Values values;

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {

    super.onUpdate(context, appWidgetManager, appWidgetIds);

    // get RemoteView (widget):
    for (int i = 0; i < appWidgetIds.length; i++) {
        int appWidgetId = appWidgetIds[i];

        RemoteViews views = new RemoteViews(context.getPackageName(),
                R.layout.appwidget);


        // Register onClick for App-start-button:
        Intent intentLaunch = new Intent(BTN_APP_LAUNCH_CLICKED);
        intentLaunch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pendingIntentLaunch = PendingIntent.getBroadcast(
                context, appWidgetId, intentLaunch,
                PendingIntent.FLAG_UPDATE_CURRENT);
        views.setOnClickPendingIntent(R.id.appwidget_btn_launch,
                pendingIntentLaunch);


        appWidgetManager.updateAppWidget(appWidgetId, views);

    }

}

@Override
public void onReceive(Context context, Intent intent) {
    RemoteViews views = new RemoteViews(context.getPackageName(),
            R.layout.appwidget);

    super.onReceive(context, intent);

    AppWidgetManager appWidgetManager = AppWidgetManager
            .getInstance(context);
    ComponentName componentName = new ComponentName(context,
            WidgetProvider.class);

    if (intent.getAction().equals(BTN_APP_LAUNCH_CLICKED)) {

        //do some stuff..
    }
    // update views
    appWidgetManager.updateAppWidget(componentName, views);

}
公共类WidgetProvider扩展了AppWidgetProvider{
私有静态最终字符串BTN\u START\u CLICKED=“PATH.widgetbnstartclicked”;
私有静态值;
@凌驾
public void onUpdate(上下文上下文,AppWidgetManager AppWidgetManager,
int[]appWidgetIds){
onUpdate(上下文、appWidgetManager、AppWidgetId);
//获取远程视图(小部件):
for(int i=0;i

我希望你能了解这个问题。如果没有,请告诉我!

我认为你的应用程序只依赖onUpdate()来刷新小部件。还有其他事件会导致挂起的意图“删除”小部件。 比如你提到的公羊清理

我建议你:
+将小部件更新代码放在单独的服务类中
+在不同事件发生时触发该类。onUpdate()和其他事件,例如,导致RAM被清除的事件。
+确保每次都使用RemoteView更新所有内容,因为不会保留旧的挂起意图等

您可以完全控制触发小部件更新的事件

如果适合您的情况,您还可以使用alarmmanager和receiver类设置任意警报。这样,您可以将警报设置为仅在手机唤醒时接收,并使用该设置调用更新服务类。在更新服务类中,然后清除任何警报(如果从其他事件调用更新)并设置另一个警报


关于谁使用带有小部件的服务,有很多问题。解决这个问题不需要很长时间。在这里输入这些信息超出了这个问题的范围。

没错,它只依赖于onUpdate()。我已经听说过使用某项服务很多次了,但我仍然不知道如何以适当的方式使用它。你能给我一个smmall的例子吗?我只需要知道从哪里开始这项服务,以及它应该是什么样子。我不知道哪些事件导致ram被清除…如果没有足够的f,Android只是在这样做ree空间(如打开大型应用程序时)。我真的很高兴看到一个简短的示例或进一步的信息。谢谢您的解释,但我仍然不明白。我如何将AppWidgetManager或AppWidgetId之类的信息传递给服务?即使我这样做,我如何在正确的时间触发?我的意思是,正确的时间应该是当小部件被激活时ble。我在问自己谷歌是如何在它的“声音搜索”小部件中做到这一点的。现在,ram清理和更新小部件之间有一段时间。我的意思是,当我关闭导致ram清理的应用程序时,这个应用程序仍然有效,但我的应用程序无效。服务不是大问题(我让它运行了),但我仍然不知道如何在ram被清理后调用它(甚至正如您所说的:在设备唤醒后)。我试图找到答案(当然是几个小时),但我仍然没有进展。我将尝试这个:你是说这个吗?我将做一些进一步的测试,但我认为这很有吸引力:-)