Android 12 xx ブロックされたソリューションからの間接的な通知アクティビティの開始 (トランポリン)

序文

最近、クリック通知が出てBroadcastBroadcast Receiverその中で何か処理をしてから開くActivity関数を書いています。デバッグ時は問題ありませんが、アプリをパッケージ化した後に通知をクリックすると開けませんActivity次のデバッグ情報が に表示されますLogcatIndirect notification activity start (trampoline) from xx blocked

質問について

テストの結果、ブロードキャスト レシーバーのメソッドが正常にトリガーされたことがわかりましたが、問題は、onReceive通知をクリックしたときに间接地開くことができないことですActivity

関連情報を調べたところ、ターゲット プラットフォームのアプリケーションにはいくつかの動作変更があるAndroid 12と思います。その中で、制限通知トランポリンは間接的に開くことを不可能にしますActivity

通知トランポリン: ユーザーが通知を操作すると、一部のアプリは通知タップに応答してなどのアプリ コンポーネントを起動します。これにより、ユーザーが最終的に表示して操作するアクティビティが最終的に起動されます。Broadcastこのアプリケーション コンポーネントは、通知トランポリンと呼ばれます。

の解き方

一連の考え

ユーザーに認識されずActivity、通知がタップされたときに直接開くものを作成しました跳板Activity跳板Activityメソッド内でデータの処理、ブロードキャストの送信、サービスの開始などをonCreate行い、最後に開きたいものを開始しますActivity上記のすべての操作を実行した後、finishメソッドを呼び出してこれを終了します跳板Activity

達成

  1. 新しい空のものを作成しますActivity(チェックしないでくださいGenerate a Layout File)

ここに画像の説明を挿入

  1. _AndroidManifest.xml構成するActivity
<activity
    android:name=".TrampolineActivity"
    android:excludeFromRecents="true"
    android:exported="false"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:label="TrampolineActivity" />
  1. 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
    }
}
  1. セットアップ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();

おすすめ

転載: blog.csdn.net/m0_52761633/article/details/130200307