ここで議論された同様の問題がいくつかありましたが、私の状況は時々うまくいきます。クリックすると同じパッケージの一部であるアクティビティを起動するウィジェットを開発しています。この同じアクティビティは、投稿される可能性のある通知によって開始することもできます。ウィジェットの更新と通知の投稿は、パッケージ内のサービスによって行われます。PendingIntent を発行するために呼び出されるメソッドは次のとおりです。
// Get pending intent for widget or notification
private PendingIntent getPendingIntent(int widgetId, int extraData) {
Intent clickIntent = new Intent(mCtx, OtdShowEvents.class);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
clickIntent.putExtra("OTDExtra", extraData);
clickIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendIntent = PendingIntent.getActivity(mCtx, 0, clickIntent,
0);
return pendIntent;
}
クリーンな (再起動された) デバイスでウィジェットのインスタンスを作成すると、ウィジェットと通知の両方が期待どおりにターゲット アクティビティを起動します。ただし、ウィジェットを削除して別のインスタンスを作成すると、インテントは起動されなくなります。同様に、ウィジェットを完全にアンインストールしてから再インストールしてインスタンスを作成しても、インテントは発生しません。ただし、電源をオフにして再度オンにすると (ウィジェットをそのままにして)、起動時に再び機能します。
途中で見たエラーの 1 つは、"名前が見つかりません" という PackageManager からのものでしたが、パッケージ名は "com.ghcssoftware.OTD.full" であり、これは私のパッケージの正しい名前です!
何か案は?ちなみに、この動作に影響を与えることなく、FLAG_CANCEL_CURRENT や FLAG_UPDATE_CURRENT などの PendingIntent フラグをいくつか試しました。
FWIW、この記事で提供されているコード スニペットは、特にウィジェットの複数のインスタンスなどで、これをすべて正しく機能させる方法を理解するために必要なものであることがわかりました。