您的位置:首页 > 移动开发 > Android开发

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

2016-01-20 15:10 1346 查看
控制背景音乐,要做到用户点击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.or
4000
igActivity);
}
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: