繁体   English   中英

从通知或外部 Intent 打开应用程序时,SingleTop launchMode 失败

[英]SingleTop launchMode fails when app is opened from notification or external Intent

我有这个最小化的应用程序:

MainActivity.java


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onNewIntent(Intent intent){
        super.onNewIntent(intent);
    }

}

活动B.java

public class ActivityB extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_b);
    }
}

AndroidManifest.xml

        <activity
            android:name=".activities.MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@style/AppTheme.NoActionBar">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="*/*" />
                <data android:mimeType="audio/*" />
            </intent-filter>

        </activity>

        <activity
            android:name=".activities.ActivityB"
            android:exported="false"
            android:parentActivityName=".activities.MainActivity"
            android:theme="@style/AppTheme.NoActionBar">
        </activity>

1)我使用 TaskStackBuilder 在应用程序关闭(终止)的情况下从服务启动通知,以打开堆栈中的 MainActivity -> ActivityB 就像文档所说的那样( https://developer.android.com/training/notify-user/navigation ) :

        Intent resultIntent = new Intent(this, ActivityB.class);
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addNextIntentWithParentStack(resultIntent);
        PendingIntent resultPendingIntent =
                stackBuilder.getPendingIntent(0,
                        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
...
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, "1")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Title")
                .setContentText("Message")
                .setAutoCancel(true)
                .setContentIntent(resultPendingIntent);

        android.app.Notification buildNotification = mBuilder.build();
        NotificationManager mNotifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        mNotifyMgr.notify(1, buildNotification);

ActivityB 在通知单击时打开,但使用后退按钮不会 go 到父 Activity (MainActivity),这正是您想要的 TaskStackBuilder。 它使应用程序关闭。

2)当打开 MainActivity 的应用程序处于后台(主页按钮)时,如果我从另一个应用程序向该应用程序共享音频文件,则始终调用 onCreate 而不是 onNewIntent。 查看 launchMode 的文档,它不应该调用 onNewIntent 因为 MainActivity 是 singleTop 并且位于堆栈的顶部吗?

测试于

  • Android 10 & Android 11
  • compileSdk版本32
  • targetSdk版本 32

尝试 singleInstance,似乎还有另一个堆栈打开,否则系统确实会调用 onNewIntent 而不是 onCreate。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM