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

控制背景音乐,要做到用户点击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;
    }



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值