Android Widget随机停止工作

时间:2012-10-24 15:13:11

标签: android android-intent widget broadcastreceiver android-pendingintent

我已经在这个问题上工作了三天了,我已经在这里查看了每个问题的答案。我有一个带有按钮的小部件,我希望它只是在每次点击时启动服务。问题是该按钮随机停止工作。我根本无法再创造它,我不知道是什么导致它。我的服务调用stopSelf();但是我也遇到了广播接收器这个问题所以我认为问题出现在小部件而不是服务中。这是代码

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

Log.i("Widget", "onUpdate");

final int N = appWidgetIds.length;

    for (int i=0; i<N; i++) 
    {

        int appWidgetId = appWidgetIds[i];

        Log.i("Widget", "onUpdateLoop");


        Intent intent = new Intent(context, ServiceWidgetAction.class);
        intent.setAction(Long.toString(System.currentTimeMillis()));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        PendingIntent pendingIntent = PendingIntent
                .getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

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

        views.setOnClickPendingIntent(R.id.widgetButton, pendingIntent);

        views.setTextViewText(
                R.id.widgetTextView,
                "Some text");

        appWidgetManager.updateAppWidget(appWidgetId, views);

    }

}

我一遍又一遍地检查了这段代码,我不知道为什么会这样做。它在3个独立的手机上执行此操作,我无法重新创建它。我已经尝试强制停止应用程序,从任务管理器清除它添加新的小部件等,以使小部件停止工作,它不会。然而,当我今天早上醒来时,小部件不再有效。任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:10)

我最终搞清楚了问题。我正在从应用程序中的其他位置更新小部件,但我没有完整的代码。换句话说,我的应用程序更新了小部件中的文本视图,如此

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

    views.setTextViewText(
            R.id.widgetTextView,
            "Some text");

    appWidgetManager.updateAppWidget(appWidgetId, views);

但它需要整个代码来保持按钮的注册:

    Intent intent = new Intent(context, ServiceWidgetAction.class);
    intent.setAction(Long.toString(System.currentTimeMillis()));
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    PendingIntent pendingIntent = PendingIntent
            .getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

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

    views.setOnClickPendingIntent(R.id.widgetButton, pendingIntent);

    views.setTextViewText(
            R.id.widgetTextView,
            "Some text");

    appWidgetManager.updateAppWidget(appWidgetId, views);

因此,无论何时从应用程序中更新窗口小部件,最重要的是确保它看起来与窗口小部件中的代码完全相同。不要遗漏任何东西。

答案 1 :(得分:0)

您是否将小部件安装到SD卡中?

Google建议将所有小部件,闹钟和接收器应用类型安装到内部存储中,因为系统同步问题就是这样。

也许不是解决方案,而是“必须检查”;)

android:installLocation="internalOnly"