多屏Android设备应用启动至副屏及副屏Activity管理相关问题
双屏Android应用(API 29)问题解答
问题1:能否将应用直接启动到副屏而非主屏
可以实现,API 29 暂不支持直接在AndroidManifest中为入口Activity指定默认启动屏幕,可通过透明占位入口Activity实现无感知启动到副屏:
- 首先创建一个完全无UI的透明Activity作为应用的主入口,在Manifest中为其配置主题为
@android:style/Theme.Translucent.NoTitleBar,且onCreate生命周期中不调用setContentView加载布局 - 在该透明Activity的
onCreate中先完成副屏DisplayId的获取,直接调用你已有的ActivityOptions.setLaunchDisplayId逻辑启动目标Activity到副屏,之后立刻调用finish()销毁自身,整个过程用户不会感知到主屏有应用启动的痕迹 - 注意提前为应用申请
android.permission.SYSTEM_ALERT_WINDOW权限,否则无法在副屏启动Activity
问题2:重新启动副屏上的Activity前,能否主动销毁正在运行的该Activity
可以实现,提供两种常用的适配方案:
方案1:静态弱引用管理(最简单,适合单应用内场景)
在副屏的目标Activity中维护全局弱引用实例:
class SecondScreenActivity : Activity() { companion object { val runningInstance: WeakReference<SecondScreenActivity?> = WeakReference(null) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) runningInstance.set(this) } override fun onDestroy() { super.onDestroy() runningInstance.clear() } }
需要销毁时直接调用:
SecondScreenActivity.runningInstance.get()?.finish() // 等待销毁完成后即可重新启动该Activity
该方式不会产生内存泄漏,逻辑简单可控。
方案2:Intent Flag 直接重置(更流畅,无需销毁重建)
如果你只是需要刷新副屏Activity的状态,不需要完全销毁重建,可以在启动Intent中添加Flag:
val exampleIntent = Intent(this, ExampleActivity::class.java) exampleIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP) // 携带新的参数 exampleIntent.putExtra("new_data", xxx) startActivity( exampleIntent, ActivityOptions.makeBasic().setLaunchDisplayId(secondDisplayId).toBundle() )
此时如果目标Activity已经在副屏运行,会回调其onNewIntent方法,你可以在该方法中直接刷新页面状态,不需要销毁再重启,切换更流畅。
内容的提问来源于stack exchange,提问作者hamrosvet
相关产品推荐
相关产品推荐

