安卓Task管理

/**

  • 维护生命周期
    */

public class UserActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks, ActivityState {
private List activityList=new ArrayList<>();
private List resumeActivity=new ArrayList<>();

@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
    Log.e("ActivityLifecycle", "onActivityCreated "+activity.getLocalClassName());
    activityList.add(0, activity);
}

@Override
public void onActivityStarted(Activity activity) {
    Log.e("ActivityLifecycle", "onActivityStarted "+activity.getLocalClassName());
}

@Override
public void onActivityResumed(Activity activity) {
    Log.e("ActivityLifecycle", "onActivityResumed activity's taskId = "+activity.getTaskId() + " name: "+activity.getLocalClassName());
    if (!resumeActivity.contains(activity)) {
        resumeActivity.add(activity);
        if(resumeActivity.size() == 1) {
            //do nothing
        }
        restartSingleInstanceActivity(activity);
    }
}

@Override
public void onActivityPaused(Activity activity) {
    Log.e("ActivityLifecycle", "onActivityPaused "+activity.getLocalClassName());
}

@Override
public void onActivityStopped(Activity activity) {
    Log.e("ActivityLifecycle", "onActivityStopped "+activity.getLocalClassName());
    resumeActivity.remove(activity);
    if(resumeActivity.isEmpty()) {
        Activity a = getOtherTaskSingleInstanceActivity(activity.getTaskId());
        if(isTargetSingleInstance(a) && !EaseCallFloatWindow.getInstance().isShowing()) {
            makeTaskToFront(a);
        }
        Log.e("ActivityLifecycle", "在后台了");
    }
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
    Log.e("ActivityLifecycle", "onActivitySaveInstanceState "+activity.getLocalClassName());
}

@Override
public void onActivityDestroyed(Activity activity) {
    Log.e("ActivityLifecycle", "onActivityDestroyed "+activity.getLocalClassName());
    activityList.remove(activity);
}

@Override
public Activity current() {
    return activityList.size()>0 ? activityList.get(0):null;
}

@Override
public List<Activity> getActivityList() {
    return activityList;
}

@Override
public int count() {
    return activityList.size();
}

@Override
public boolean isFront() {
    return resumeActivity.size() > 0;
}

/**
 * 跳转到目标activity
 * @param cls
 */
public void skipToTarget(Class<?> cls) {
    if(activityList != null && activityList.size() > 0) {
        current().startActivity(new Intent(current(), cls));
        for (Activity activity : activityList) {
            activity.finish();
        }
    }

}

/**
 * finish target activity
 * @param cls
 */
public void finishTarget(Class<?> cls) {
    if(activityList != null && !activityList.isEmpty()) {
        for (Activity activity : activityList) {
            if(activity.getClass() == cls) {
                activity.finish();
            }
        }
    }
}

/**
 * 判断app是否在前台
 * @return
 */
public boolean isOnForeground() {
    return resumeActivity != null && !resumeActivity.isEmpty();
}


/**
 * 用于按下home键,点击图标,检查启动模式是singleInstance,且在activity列表中首位的Activity
 * 下面的方法,专用于解决启动模式是singleInstance, 为开启悬浮框的情况
 * @param activity
 */
private void restartSingleInstanceActivity(Activity activity) {
    boolean isClickByFloat = activity.getIntent().getBooleanExtra("isClickByFloat", false);
    if(isClickByFloat) {
        return;
    }
    //刚启动,或者从桌面返回app
    if(resumeActivity.size() == 1 && resumeActivity.get(0) instanceof MainActivity) {
        return;
    }
    //至少需要activityList中至少两个activity
    if(resumeActivity.size() >= 1 && activityList.size() > 1) {
        Activity a = getOtherTaskSingleInstanceActivity(resumeActivity.get(0).getTaskId());
        if(a != null && !a.isFinishing() //没有正在finish
                && a != activity //当前activity和列表中首个activity不相同
                && a.getTaskId() != activity.getTaskId()
                && !EaseCallFloatWindow.getInstance().isShowing()
        ){
            Log.e("ActivityLifecycle", "启动了activity = "+a.getClass().getName());
            activity.startActivity(new Intent(activity, a.getClass()));
        }
    }
}

private Activity getOtherTaskSingleInstanceActivity(int taskId) {
    if(taskId != 0 && activityList.size() > 1) {
        for (Activity activity : activityList) {
            if(activity.getTaskId() != taskId) {
                if(isTargetSingleInstance(activity)) {
                    return activity;
                }
            }
        }
    }
    return null;
}

/**
 * 此方法用于设置启动模式为singleInstance的activity调用
 * 用于解决点击悬浮框后,然后finish当前的activity,app回到桌面的问题
 * 需要如下两个权限:
 *     <uses-permission android:name="android.permission.GET_TASKS" />
 *     <uses-permission android:name="android.permission.REORDER_TASKS"/>
 * @param activity
 */
@SuppressLint("MissingPermission")
public void makeMainTaskToFront(Activity activity) {
    //当前activity正在finish,且可见的activity列表中只有这个正在finish的activity,且没有销毁的activity个数大于等于2
    if(activity.isFinishing() && resumeActivity.size() == 1 && resumeActivity.get(0) == activity && activityList.size() > 1) {
        ActivityManager manager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> runningTasks = manager.getRunningTasks(20);
        for(int i = 0; i < runningTasks.size(); i++) {
            ActivityManager.RunningTaskInfo taskInfo = runningTasks.get(i);
            ComponentName topActivity = taskInfo.topActivity;
            //判断是否是相同的包名
            if(topActivity != null && topActivity.getPackageName().equals(activity.getPackageName())) {
                int taskId;
                if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    taskId = taskInfo.taskId;
                }else {
                    taskId = taskInfo.id;
                }
                //将任务栈置于前台
                Log.e("ActivityLifecycle", "执行moveTaskToFront,current activity:"+activity.getClass().getName());
                manager.moveTaskToFront(taskId, ActivityManager.MOVE_TASK_WITH_HOME);
            }
        }
    }
}

private boolean isTargetSingleInstance(Activity activity) {
    if(activity == null) {
        return false;
    }
    CharSequence title = activity.getTitle();
    if(TextUtils.equals(title, activity.getString(R.string.demo_activity_label_video_call))
            || TextUtils.equals(title, activity.getString(R.string.demo_activity_label_multi_call))) {
        return true;
    }
    return false;
}

@SuppressLint("MissingPermission")
private void makeTaskToFront(Activity activity) {
    Log.e("ActivityLifecycle", "makeTaskToFront activity: "+activity.getLocalClassName());
    ActivityManager manager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
    manager.moveTaskToFront(activity.getTaskId(), ActivityManager.MOVE_TASK_WITH_HOME);
}

}

在Application中调用
private UserActivityLifecycleCallbacks mLifecycleCallbacks = new UserActivityLifecycleCallbacks();

public UserActivityLifecycleCallbacks getLifecycleCallbacks() {
return mLifecycleCallbacks;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android任务管理器是一个用于管理和监控应用程序中的任务和进程的工具。它可以帮助用户查看和关闭正在运行的应用程序和服务,以释放内存和提高设备性能。 在提供的代码片段中,有两个方法doTimeoutTask和doNormalTask,它们分别用于执行超时任务和普通任务。 doTimeoutTask方法的作用是创建一个超时任务,它会在指定的时间内执行任务,并在超时时触发onTimeout回调方法。在代码中,任务通过TaskPool.getInstance().execute()方法进行执行,并使用Task类的子类进行封装。具体的任务逻辑在onRun方法中实现,在本例中,它会简单地睡眠1秒钟。cancelTask方法在这里没有实现任何具体操作。 doNormalTask方法用于创建一个普通任务,它会按照一定的逻辑顺序执行任务,并通过notifyLoading、notifySuccess、notifyFail方法通知任务的进度和结果。在本例中,任务会简单地睡眠一段时间后,随机决定任务成功或失败。cancelTask方法在这里同样没有实现任何具体操作。 在提供的代码片段中还有一段XML代码,它是一个Android清单文件的基本结构。清单文件用于描述应用程序的基本信息和配置,其中包括包名、版本号等内容。 综上所述,Android任务管理器是用于管理和监控应用程序中的任务和进程的工具。在提供的代码片段中,doTimeoutTask方法用于执行超时任务,doNormalTask方法用于执行普通任务,清单文件是应用程序的配置文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值