Java 重新启动或升级应用程序后,我的Android小部件停止更新

Java 重新启动或升级应用程序后,我的Android小部件停止更新,java,android,android-studio,android-activity,android-widget,Java,Android,Android Studio,Android Activity,Android Widget,每当我重新启动手机或升级应用程序时(在我的测试设备和Androidemulator上),小部件都会停止更新,直到我创建了一个新的小部件实例。然后,小部件的两个实例将再次开始更新。我假设这是因为在旧的WidgetIds上调用onUpdate()造成的,但我无法理解。 这是我的代码的一小部分 public class NewAppWidget extends AppWidgetProvider { private static final String refresh = "b_refresh"

每当我重新启动手机或升级应用程序时(在我的测试设备和
Android
emulator上),小部件都会停止更新,直到我创建了一个新的小部件实例。然后,小部件的两个实例将再次开始更新。我假设这是因为在旧的
WidgetIds
上调用
onUpdate()
造成的,但我无法理解。 这是我的代码的一小部分

 public class NewAppWidget extends AppWidgetProvider {

private static final String refresh = "b_refresh";

static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {

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

    Intent intent = new Intent(context, NewAppWidget.class);
    intent.setAction(refresh);
    intent.putExtra("appWidgetId", appWidgetId);

    views.setOnClickPendingIntent(R.id.refresh, PendingIntent.getBroadcast(context,0,intent, PendingIntent.FLAG_UPDATE_CURRENT));
    appWidgetManager.updateAppWidget(appWidgetId, views);
}

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

    for (int appWidgetId : appWidgetIds) {
        updateAppWidget(context, appWidgetManager, appWidgetId);
    }
}

@Override
public void onReceive(Context context, Intent intent) {
    if(refresh.equals(intent.getAction())) {
        Toast.makeText(context, "Clicked2", Toast.LENGTH_LONG).show();
    }
}
}

编辑:这是我的manifest.xml

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver android:name=".NewAppWidget">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="android.appwidget.action.EXTRA_APPWIDGET_IDS"/>
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/new_app_widget_info" />
    </receiver>

    <activity android:name=".NewAppWidgetConfigureActivity">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
        </intent-filter>
    </activity>
</application>



将对
super.onReceive()
的调用添加到您的
onReceive()

解释


如果查看基类
onReceive()
的源代码,可以看到它实现了用于管理小部件生命周期的部分框架逻辑。(也被媒体暗示)。它处理
APPWIDGET\u UPDATE
,实际上,它首先负责调用
onUpdate()
。(例如,当系统启动时,需要绘制您的初始小部件,它会向您的应用程序发送一个
APPWIDGET\u UPDATE
,并将其传递到
onReceive()
)。因此,我不能100%确定在您的情况下,
onUpdate()
是如何被调用的,但我假设您在其他地方有一些代码调用了
updateAppWidget()
,这是您的小部件看起来能够即时工作的唯一原因。

我们可以看到AndroidManifest.xml的匹配部分(您注册提供者的地方)吗?@greeble31当然,我已经用.xml.Hmm编辑了这个问题。那
额外的APPWIDGET\u id
确实不应该存在(b/c这不是一个动作),但我看不出是什么导致了你的问题。1.)您如何确切地知道小部件没有更新?2.)每次记录对
onUpdate()
的调用并转储
appWidgetIds
如何?我已经尝试删除该标志,但保留了它,因为我没有注意到在这样做时有任何更改。因此,当我升级应用程序或重新启动手机时,刷新按钮停止工作。但是,当我在我的主应用程序(具有相同的代码)中登录
onUpdate
时,现有小部件不会调用
onUpdate
。当我创建第二个小部件实例时,旧实例只会再次调用
onUpdate
。我怀疑
onUpdate()
确实是在重新启动后被调用的,否则您会说,“小部件在重新启动时消失。”您的问题听起来更像是
意图
没有按您预期的方式进入活动。请您仔细解释一下“主要应用程序”和“相同代码”是什么意思(也许可以将此添加到您的问题中)?我们正在处理同时安装的两个应用程序吗?还有,当你说“升级”时,我认为这意味着“增加
android:versionCode
并重新安装”。这就是你的意思吗?