安卓小部件随机停止工作

6

我已经在解决这个问题三天了,看过这里的每一个问题以寻找答案。我有一个带有按钮的小部件,我只想要它在每次点击时启动服务。但是问题在于这个按钮会随机停止工作。我无法重现它,并且也不知道是什么原因导致的。我的服务调用了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);

    }

}

我已经一遍又一遍地检查了这段代码,但我不知道为什么会出现这种情况。在三部不同的手机上都发生了这种情况,但我却无法复现。我尝试过强行停止应用程序、从任务管理器中清除它,添加新的小部件等方式来使小部件停止工作,但是都没有用。然而,今天早上当我起床后,小部件就再也没有工作了。非常感谢任何帮助。

当它发生时,您在LogCat中看到了什么吗? - CaseyB
日志中没有任何内容,就像在活动中没有onClick方法的按钮一样。我可以看到它被按下了,但是应用程序或日志中什么也没有发生。 - John P.
2个回答

11
我最终找出了问题所在。我在应用程序的其他地方更新小部件,但是对于每个小部件,我没有完整的代码。换句话说,我的应用程序会像这样更新小部件中的文本视图。
    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
谢谢。在我的情况下,总是更新小部件的单个方法在某些情况下可能会抛出异常,并且代码的一部分将不会执行。 - Alireza
1
这是黄金,等等不对——它价值比比特币还高——10倍伙计。 - gor

0
你是否将小部件安装到SD卡中了?
谷歌建议将所有小部件、闹钟和接收器应用程序类型安装到内部存储器中,以避免系统同步问题。
也许不是解决方案,但一定要检查一下;)
android:installLocation="internalOnly"

我没有考虑到这一点,因为我确实启用了应用程序到SD卡,但我刚刚检查了一下,发现该应用程序安装在内部存储器中。不过还是谢谢你的建议! - John P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接