欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android 类似微信小程序多任务窗口 及 设置 TaskDescription 修改 icon 和 label

程序员文章站 2022-08-29 12:37:12
1.启动 一个独立窗口//绑定唯一标识 tag,存在 则根据 taskId 移动到前台if (AppManager.getInstance().isActive(tag)) { AppManager.getInstance().resumeActivty(tag);} else { Intent intent = new Intent(context, MyActivity.class); //打开多任务窗口 flags intent.addFlags(Inten...
<!-- 根据taskId 调整 activity 到前台 (配合使用)-->
<uses-permission android:name="android.permission.REORDER_TASKS" />
<-- 必须使用 standard 启动模式 -->
<activity android:name=".MyActivity" android:launchMode="standard" />

1.启动 一个独立窗口

//绑定唯一标识 tag,存在 则根据 taskId 移动到前台
if (ActManager.getInstance().isActive(tag)) {
    ActManager.getInstance().resumeActivty(tag);
} else {
    Intent intent = new Intent(context, MyActivity.class);

    //打开多任务窗口 flags
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
    intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
    intent.putExtra("tag", tag);
    context.startActivity(intent);
}

2.动态设置 activity 的 icon 和 label(如不需要动态设置 ,则在 AndroidManifest.xml activity 标签下写死即可)

Bitmap iconBitmap;
int iconResId;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    //设置 任务列表 的 label 和 icon,两种方式(部分机型设置icon无效)
    setTaskDescription(ActivityManager.TaskDescription("activity标题",iconResId));
     //该方法在Api 28 已弃用
    //setTaskDescription(ActivityManager.TaskDescription("activity标题",iconBitmap));
}

3.另外 activity 需要在onCreate 方法调用时,把当前activity 缓存管理起来(可继承一个BaseActivity)

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    //缓存当前activity
    ActManager.getInstance().add(this);
}

4.配合使用(根据需求而定)

/**
 * 把Activity添加到管理中
 */
public void add(Activity activity) {
    if (activity != null) {
        //如果是 MyActivity 则缓存起来
        if (activity instanceof MyActivity) {
            String tag = ((MyActivity) activity).getTag();
            //存入内存中
            mArrayMap.put(tag, activity);
        }
    }
}
/**
 * 判断 tag绑定的 MyActivity是否存在
 */
public boolean isActive(String tag) {
    Activity activity=mArrayMap.get(tag);
    if (activity != null) {
        //判断是否为 MyActivity,如果已经销毁,则移除
        if (activity.isFinishing() || activity.isDestroyed()) {
            mArrayMap.remove(tag);
            return false;
        } else {
            return true;
        }
     } else {
        return false;
     }
}
/**
  * 找到tag 绑定的 MyActivty ,通过 getTaskId() 移动到前台
  */
public void resumeActivty(String tag) {
   Activity activity=mArrayMap.get(tag);
   if ( activity!= null && !activity.isFinishing() && !activity.isDestroyed()) {
       ActivityManager am = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
       //返回启动它的根任务(home 或者 MainActivity)
       am.moveTaskToFront(activity.getTaskId(), ActivityManager.MOVE_TASK_NO_USER_ACTION);
    }
}
/**
 * 结束指定Activity
 */
public void finish(Activity activity) {
   try {
       if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) {
          //根据tag 移除 MyActivity
          if (activity instanceof MyActivity) {
              Strnig tag= ((MyActivity) activity).getTag();
              mArrayMap.remove(tag);
          }
          activity.finish();
        }
    } catch (Exception e) {
            e.printStackTrace();
    }
}

 

本文地址:https://blog.csdn.net/qq_29364417/article/details/109379915