Android 最小化实践

本文记录了在Android开发中实现语音直播间需求时的最小化实践。通过设置Activity启动模式为singleInstance,调整taskAffinity并利用startActivityForResult和startActivity,结合服务的使用,完成activity最小化到后台并保持任务栈的功能。然而,存在一个问题,即最小化后,独立任务栈的Activity可能在打开其他应用后被销毁,而同一进程的app并未受到影响,这个问题尚待解决。

最近在工作中,接到语音直播间开发的需求。由于此前没有做过类似功能,遂进行记录一下。

实现此功能有以下步骤:

1:启动模式

2:启动Activity:startActivity 和 startActivityForResult的区别

3:服务

一、启动模式

设置activity启动模式为singleInstance,然后设置taskAffinity使activity运行在独立的activity任务栈中。设置taskAffinity后,安卓后台任务会显示独立的activity任务栈(参考微信小程序),为了避免重复的在后台显示activity任务栈,需要在当前activity的清单文件中设置 android:excludeFromRecents="true"。

二、启动Activity

安卓启动activity ,我们通常会使用startActivity或startActivityForResult,后者退出时会走OnActivityForResult回调。在activity启动模式为singleInstance模式下,使用startActivityForResult将导致启动模式不起作用。目前还不清楚是什么原因。希望了解的大佬解释下,感谢!

三、开启服务

前面说了这么多,终于进入到最小化环节。首先,最小化要设置当前任务栈moveTaskToBack(true), 参数如果为false,则只有当活动是根时才有效,如果是true,它将工作于任何activity任务。将任务栈移到后台后,我们需要开启一个服务,在服务的onStartCommand回调中添加一个窗口视图

 LayoutInflater layoutInflater = LayoutInflater.from(this);
 //悬浮窗口显示的view
 displayView = layoutInflater.inflate(R.layout.party_windows_layout, null);
 windowManager.addView(displayView, layoutParams);

然后设置点击视图,再跳回到移入后台的activity任务栈中的activity ,

Intent intent = new Intent(context, TestActivty.class)
       intent.addCategory(Intent.CATEGORY_LAUNCHER);
       intent.setAction(Intent.ACTION_MAIN);
       intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
       context.startActivity(intent);

移除窗口视图,关闭服务。 

if (displayView != null && windowManager != null) {
                // 移除悬浮窗口
                windowManager.removeView(displayView);
                stopSelf();
            }

至此,我们已经完成了安卓activity的最小化实践。虽然完成了基本的最小化功能,但是目前还有一个问题需要解决:

最小化后,在打开其他app后,独立任务栈中的Activty会被销毁,但是和其同一进程下的app并没有被销毁。这个不知道是安卓回收机制的问题,还是其他设置的问题,目前还没有很好的解决,后续会继续看下有没有更好的解决方案。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值