序文
最近、クリック通知が出てBroadcast
、Broadcast Receiver
その中で何か処理をしてから開くActivity
関数を書いています。デバッグ時は問題ありませんが、アプリをパッケージ化した後に通知をクリックすると開けませんActivity
。次のデバッグ情報が に表示されますLogcat
。Indirect notification activity start (trampoline) from xx blocked
質問について
テストの結果、ブロードキャスト レシーバーのメソッドが正常にトリガーされたことがわかりましたが、問題は、onReceive
通知をクリックしたときに间接地
開くことができないことですActivity
。
関連情報を調べたところ、ターゲット プラットフォームのアプリケーションにはいくつかの動作変更があるAndroid 12
と思います。その中で、制限通知トランポリンは間接的に開くことを不可能にしますActivity
。
通知トランポリン: ユーザーが通知を操作すると、一部のアプリは通知タップに応答してなどのアプリ コンポーネントを起動します。これにより、ユーザーが最終的に表示して操作するアクティビティが最終的に起動されます。
Broadcast
このアプリケーション コンポーネントは、通知トランポリンと呼ばれます。
の解き方
一連の考え
ユーザーに認識されずActivity
、通知がタップされたときに直接開くものを作成しました跳板Activity
。跳板Activity
メソッド内でデータの処理、ブロードキャストの送信、サービスの開始などをonCreate
行い、最後に開きたいものを開始しますActivity
。上記のすべての操作を実行した後、finish
メソッドを呼び出してこれを終了します跳板Activity
達成
- 新しい空のものを作成します
Activity
(チェックしないでくださいGenerate a Layout File
)
- _で
AndroidManifest.xml
構成するActivity
<activity
android:name=".TrampolineActivity"
android:excludeFromRecents="true"
android:exported="false"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:label="TrampolineActivity" />
TrampolineActivity
ビジネスコードを書く
package xxx;
import static xxx.NOTIFICATION_PRESS_ACTION;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
public class TrampolineActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 编写你的代码,发送 Broadcast 等
Intent mainActivityIntent = new Intent(this, MainActivity.class);
mainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(mainActivityIntent); // 启动要打开的Activity
finish(); // 结束跳板Activity
}
}
- セットアップ
Notification
_ContentIntent
Intent intent = new Intent(context, TrampolineActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, gatheringEventItem.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
Notification notification = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
.setContentTitle("通知标题")
.setContentText("通知内容")
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.build();