Android-O中新的ActivityOptions setLaunchDisplayId (int launchDisplayId(函数似乎总是在我尝试启动活动意图时使我的应用程序崩溃。
当我从自己的应用程序启动活动时,以及当我尝试启动其他应用程序(即 Chrome 金丝雀(时。
有谁知道这是新 API 的普遍问题还是我错过了一些东西:
我的一小段代码如下:
options.setLaunchDisplayId(1);
startActivity(intent, options);
注意我在启用"模拟第二个屏幕"的情况下进行测试(如果重要的话@1080p(。
更新我已经尝试了ADB命令adb shell start com.chrome.canary --display 1
,我得到消息:
开始:必须是根
这是一个简化的答案,它对我有用,建立在@Smiler的基础上。我通过Button
单击我的MainActivity
对此进行了测试。感谢您的帮助!
((Button) findViewById(R.id.launchTopScreen)).setOnClickListener(v -> {
Intent intent = getPackageManager().getLaunchIntentForPackage("com.example.new.app");
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
ActivityOptions options = ActivityOptions.makeBasic().setLaunchDisplayId(1);
startActivity(intent, options.toBundle());
});
为了在不同的显示器上启动新的应用程序,Intent.FLAG_ACTIVITY_NEW_TASK
非常重要。否则,它将在同一任务堆栈中启动,在同一显示器上启动。
该"新应用程序"也需要在清单中具有android:resizeableActivity="true"
。 True
是默认设置,但我指定只是显式并保护未来的框架更改。
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:resizeableActivity="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<</div>
div class="one_answers">我已经通过新的API使用以下代码连接到第二个屏幕,但到目前为止还没有办法与之交互。
Bundle bdl;
MediaRouter mediaRouter = (MediaRouter) mContext.getSystemService(Context.MEDIA_ROUTER_SERVICE);
MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO);
if (route != null) {
Display presentationDisplay = route.getPresentationDisplay();
bdl = ActivityOptions.makeClipRevealAnimation(mView, left, top, width, height).setLaunchBounds(rect).setLaunchDisplayId(presentationDisplay.getDisplayId()).toBundle();
Bundle optsBundle = true ? bdl : null;
Intent intent = new Intent(mContext, SecondaryActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent, optsBundle);
}
每次添加新的模拟屏幕时,显示 ID 都会更改。 重新启动时,它将重置为 1。 检查这是否是问题所在。 您指定的 adb 命令似乎不像您所说的那样工作。