android监听应用缓存和任务栈顶的方法

来源:互联网 发布:头戴式蓝牙推荐 知乎 编辑:程序博客网 时间:2024/05/18 20:07

控制背景音乐,要做到用户点击home键或者当前屏幕显示的程序不是自己的程序的时候。音乐暂停。回到程序后继续播放。遇到多机型的问题。有些手机有多任务键。有些没有。如果只监听任务栈,在没有多任务键的手机的确可以做到,在有多任务键的系统中,点击home键栈顶还是自己的程序,并没有跳到桌面的程序去。原因也没有去了解。

好在有几个热心的同行帮忙想办法才找到解决的方式。

下面就把代码粘贴。以便自己以后记录

主要方法就是写一个基类。让所有activity继承。并且在生命周期进行控制

 /**     * 判断当前应用程序处于任务栈顶     */    public static boolean isApplicationBroughtToBackground(final Context context) {ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);List<RunningTaskInfo> tasks = am.getRunningTasks(1);if (!tasks.isEmpty()) {    ComponentName topActivity = tasks.get(0).topActivity;    if (!topActivity.getPackageName().equals(context.getPackageName())) {return true;    }}return false;    }

/**     * 判断程序是否在缓存顶部     * @param context     * @return     */    public static boolean isAppOnForeground(Context context) {ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);String packageName = context.getPackageName();List<RecentTaskInfo> appTask = activityManager.getRecentTasks(5, 0x0002);if (appTask != null) {if (appTask.get(0).baseIntent.toString().contains(packageName)) {    return true;}}return false;    }

.



/**     * 启动activity,如果该activity已经启动,则直接打开;如果该activity没有启动,则从新启动.     * 一般用于状态栏点击进入程序时使用.     *     * @param context     * @param cls     被启动的activity     */    public static Intent startTaskIntent(Context context, Class<?> cls) {        if (android.os.Build.VERSION.SDK_INT >= 21) {            return startNewApiTaskIntent(context, cls);        } else {            return startOldApiTaskIntent(context, cls);        }    }    @TargetApi(Build.VERSION_CODES.LOLLIPOP)    private static Intent startNewApiTaskIntent(Context context, Class<?> cls) {        final PackageManager pm = context.getPackageManager();        final ActivityManager am = (ActivityManager)                context.getSystemService(Context.ACTIVITY_SERVICE);        List<ActivityManager.AppTask> appTasks = am.getAppTasks();        for (ActivityManager.AppTask task : appTasks) {            final ActivityManager.RecentTaskInfo info = task.getTaskInfo();            Intent intent = new Intent(info.baseIntent);            if (info.origActivity != null) {                intent.setComponent(info.origActivity);            }            final ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);            if (resolveInfo != null) {                final ActivityInfo activityInfo = resolveInfo.activityInfo;                if (TextUtils.equals(activityInfo.packageName, context.getPackageName())) {                    return intent;                }            }        }        Intent intent = new Intent(context, cls);        intent.setFlags((intent.getFlags() & ~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)                | Intent.FLAG_ACTIVITY_NEW_TASK);        return intent;    }    private static Intent startOldApiTaskIntent(Context context, Class<?> cls) {        final PackageManager pm = context.getPackageManager();        final ActivityManager am = (ActivityManager)                context.getSystemService(Context.ACTIVITY_SERVICE);        final List<ActivityManager.RecentTaskInfo> recentTasks = am.getRecentTasks(20, 0x0002);        for (ActivityManager.RecentTaskInfo info : recentTasks) {            Intent intent = new Intent(info.baseIntent);            if (info.origActivity != null) {                intent.setComponent(info.origActivity);            }            final ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);            if (resolveInfo != null) {                final ActivityInfo activityInfo = resolveInfo.activityInfo;                if (TextUtils.equals(activityInfo.packageName, context.getPackageName())) {                    context.startActivity(intent);                    return intent;                }            }        }        Intent intent = new Intent(context, cls);        intent.setFlags((intent.getFlags() & ~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)                | Intent.FLAG_ACTIVITY_NEW_TASK);        return intent;    }



0 0