android监听应用缓存和任务栈顶的方法
2016-01-20 15:10
1346 查看
控制背景音乐,要做到用户点击home键或者当前屏幕显示的程序不是自己的程序的时候。音乐暂停。回到程序后继续播放。遇到多机型的问题。有些手机有多任务键。有些没有。如果只监听任务栈,在没有多任务键的手机的确可以做到,在有多任务键的系统中,点击home键栈顶还是自己的程序,并没有跳到桌面的程序去。原因也没有去了解。
好在有几个热心的同行帮忙想办法才找到解决的方式。
下面就把代码粘贴。以便自己以后记录
主要方法就是写一个基类。让所有activity继承。并且在生命周期进行控制
.
/**
* 启动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;
}
好在有几个热心的同行帮忙想办法才找到解决的方式。
下面就把代码粘贴。以便自己以后记录
主要方法就是写一个基类。让所有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;
}
相关文章推荐
- Android Studio导入(import)工程时常见错误
- GestureDetector 和SimpleOnGestureListener的使用和解释
- Android 系统状态栏一体化
- Android自定义控件样式实例详解
- Android 获取地理位置的经度和纬度(zz)
- Android反编译apk及常见问题
- android 自定义提示框效果(1)
- 使用Android Studio调试Android Framework代码
- android命令
- Android 四大大图片缓存(Imageloader,Picasso,Glide,Fresco)原理、特性对比
- android inflater 用法
- Android Studio 日常问题处理
- Android Intent详解
- android监听联系人变化的方法
- android shape记录
- 解决Android Studio 导入工程的问题
- Android 进程间通讯四种方式
- android meta-data 使用
- Android缓冲流
- Android Manifest.xml中intent-filter的(data)