看注解;
看注解;
看注解;
package com.example.bandofbrotherszts.androidphoneinfo;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.AnimRes;
import android.support.annotation.NonNull;
import android.support.v4.util.ArrayMap;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;
/**
* 应用程序Activity管理类
*/
public class ActivityManager {
private static Stack
activityStack;
private static ActivityManager instance = null;
private static Context context ;
private ActivityManager() {
}
/**
* 单例
*/
public static ActivityManager getAppManager(Context mcontext) {
if (instance == null) {
instance = new ActivityManager();
}
context = mcontext.getApplicationContext();
return instance;
}
/**
* 添加Activity到堆栈
*/
public void addActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack<>();
}
activityStack.add(activity);
}
/**
* 获取当前Activity(堆栈种最后一个压入的)
*/
public Activity currentActivity() {
Activity activity = activityStack.lastElement();
return activity;
}
/**
* 结束当前Activity
*/
public void finishActivity() {
Activity activity = activityStack.lastElement();
if (activity != null) {
activityStack.remove(activity);
activity.finish();
activity = null;
}
}
/**
* 结束指定的Activity
*/
public void finishActivity(Activity activity) {
if (activity != null) {
activityStack.remove(activity);
activity.finish();
activity = null;
}
}
/**
* 结束指定类名的Activity
*/
public void finishActivity(Class
cls) {
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
finishActivity(activity);
}
}
}
/**
* 结束指定位置的Activity
*/
public void finishPositionActivity(int index) {
Activity activity = activityStack.get(index);
finishActivity(activity);
}
/**
* 结束所有Activity
*/
public void finishAllActivity() {
for (int i = 0, size = activityStack.size(); i < size; i++) {
if (null != activityStack.get(i)) {
activityStack.get(i).finish();
}
}
activityStack.clear();
}
/**
* 判断是否存在Activity
*
* @param packageName 包名
* @param className activity全路径类名
* @return {@code true}: 是
{@code false}: 否
*/
public boolean isActivityExists(@NonNull final String packageName,
@NonNull final String className) {
Intent intent = new Intent();
intent.setClassName(packageName, className);
return !(context.getPackageManager().resolveActivity(intent, 0) == null ||
intent.resolveActivity(context.getPackageManager()) == null ||
context.getPackageManager().queryIntentActivities(intent, 0).size() == 0);
}
/**
* 启动Activity
*
* @param cls activity类
*/
public void startActivity(@NonNull final Class
cls) {
startActivity(context, null, context.getPackageName(), cls.getName(), null);
}
/**
* 启动Activity
*
* @param cls activity类
* @param options 跳转动画
*/
public void startActivity(@NonNull final Class
cls,
@NonNull final Bundle options) {
startActivity(context, null, context.getPackageName(), cls.getName(), options);
}
/**
* 启动Activity
*
* @param activity activity
* @param cls activity类
*/
public void startActivity(@NonNull final Activity activity,
@NonNull final Class
cls) {
startActivity(activity, null, activity.getPackageName(), cls.getName(), null);
}
/**
* 启动Activity
*
* @param activity activity
* @param cls activity类
* @param options 跳转动画
*/
public void startActivity(@NonNull final Activity activity,
@NonNull final Class
cls,
@NonNull final Bundle options) {
startActivity(activity, null, activity.getPackageName(), cls.getName(), options);
}
/**
* 启动Activity
*
* @param activity activity
* @param cls activity类
* @param enterAnim 入场动画
* @param exitAnim 出场动画
*/
public void startActivity(@NonNull final Activity activity,
@NonNull final Class
cls,
@AnimRes final int enterAnim,
@AnimRes final int exitAnim) {
startActivity(activity, null, activity.getPackageName(), cls.getName(), null);
activity.overridePendingTransition(enterAnim, exitAnim);
}
/**
* 启动Activity
*
* @param extras extras
* @param cls activity类
*/
public void startActivity(@NonNull final Bundle extras,
@NonNull final Class
cls) {
startActivity(context, extras, context.getPackageName(), cls.getName(), null);
}
/**
* 启动Activity
*
* @param extras extras
* @param cls activity类
* @param options 跳转动画
*/
public void startActivity(@NonNull final Bundle extras,
@NonNull final Class
cls,
@NonNull final Bundle options) {
startActivity(context, extras, context.getPackageName(), cls.getName(), options);
}
/**
* 启动Activity
*
* @param extras extras
* @param activity activity
* @param cls activity类
*/
public void startActivity(@NonNull final Bundle extras,
@NonNull final Activity activity,
@NonNull final Class
cls) {
startActivity(activity, extras, activity.getPackageName(), cls.getName(), null);
}
/**
* 启动Activity
*
* @param extras extras
* @param activity activity
* @param cls activity类
* @param options 跳转动画
*/
public void startActivity(@NonNull final Bundle extras,
@NonNull final Activity activity,
@NonNull final Class
cls,
@NonNull final Bundle options) {
startActivity(activity, extras, activity.getPackageName(), cls.getName(), options);
}
/**
* 启动Activity
*
* @param extras extras
* @param activity activity
* @param cls activity类
* @param enterAnim 入场动画
* @param exitAnim 出场动画
*/
public void startActivity(@NonNull final Bundle extras,
@NonNull final Activity activity,
@NonNull final Class
cls,
@AnimRes final int enterAnim,
@AnimRes final int exitAnim) {
startActivity(activity, extras, activity.getPackageName(), cls.getName(), null);
activity.overridePendingTransition(enterAnim, exitAnim);
}
/**
* 启动Activity
*
* @param pkg 包名
* @param cls 全类名
*/
public void startActivity(@NonNull final String pkg,
@NonNull final String cls) {
startActivity(context, null, pkg, cls, null);
}
/**
* 启动Activity
*
* @param pkg 包名
* @param cls 全类名
* @param options 动画
*/
public void startActivity(@NonNull final String pkg,
@NonNull final String cls,
@NonNull final Bundle options) {
startActivity(context, null, pkg, cls, options);
}
/**
* 启动Activity
*
* @param activity activity
* @param pkg 包名
* @param cls 全类名
*/
public void startActivity(@NonNull final Activity activity,
@NonNull final String pkg,
@NonNull final String cls) {
startActivity(activity, null, pkg, cls, null);
}
/**
* 启动Activity
*
* @param activity activity
* @param pkg 包名
* @param cls 全类名
* @param options 动画
*/
public void startActivity(@NonNull final Activity activity,
@NonNull final String pkg,
@NonNull final String cls,
@NonNull final Bundle options) {
startActivity(activity, null, pkg, cls, options);
}
/**
* 启动Activity
*
* @param activity activity
* @param pkg 包名
* @param cls 全类名
* @param enterAnim 入场动画
* @param exitAnim 出场动画
*/
public void startActivity(@NonNull final Activity activity,
@NonNull final String pkg,
@NonNull final String cls,
@AnimRes final int enterAnim,
@AnimRes final int exitAnim) {
startActivity(activity, null, pkg, cls, null);
activity.overridePendingTransition(enterAnim, exitAnim);
}
/**
* 启动Activity
*
* @param extras extras
* @param pkg 包名
* @param cls 全类名
*/
public void startActivity(@NonNull final Bundle extras,
@NonNull final String pkg,
@NonNull final String cls) {
startActivity(context, extras, pkg, cls, null);
}
/**
* 启动Activity
*
* @param extras extras
* @param pkg 包名
* @param cls 全类名
* @param options 动画
*/
public void startActivity(@NonNull final Bundle extras,
@NonNull final String pkg,
@NonNull final String cls,
@NonNull final Bundle options) {
startActivity(context, extras, pkg, cls, options);
}
/**
* 启动Activity
*
* @param activity activity
* @param extras extras
* @param pkg 包名
* @param cls 全类名
*/
public void startActivity(@NonNull final Bundle extras,
@NonNull final Activity activity,
@NonNull final String pkg,
@NonNull final String cls) {
startActivity(activity, extras, pkg, cls, null);
}
/**
* 启动Activity
*
* @param extras extras
* @param activity activity
* @param pkg 包名
* @param cls 全类名
* @param options 动画
*/
public void startActivity(@NonNull final Bundle extras,
@NonNull final Activity activity,
@NonNull final String pkg,
@NonNull final String cls,
@NonNull final Bundle options) {
startActivity(activity, extras, pkg, cls, options);
}
/**
* 启动Activity
*
* @param extras extras
* @param pkg 包名
* @param cls 全类名
* @param enterAnim 入场动画
* @param exitAnim 出场动画
*/
public void startActivity(@NonNull final Bundle extras,
@NonNull final Activity activity,
@NonNull final String pkg,
@NonNull final String cls,
@AnimRes final int enterAnim,
@AnimRes final int exitAnim) {
startActivity(activity, extras, pkg, cls, null);
activity.overridePendingTransition(enterAnim, exitAnim);
}
private void startActivity(final Context context,
final Bundle extras,
final String pkg,
final String cls,
final Bundle options) {
Intent intent = new Intent(Intent.ACTION_VIEW);
if (extras != null) intent.putExtras(extras);
intent.setComponent(new ComponentName(pkg, cls));
if (!(context instanceof Activity)) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
if (options != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
context.startActivity(intent, options);
} else {
context.startActivity(intent);
}
}
/**
* 退出应用程序
*/
public void appExit(Context context) {
try {
finishAllActivity();
// ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
// manager.killBackgroundProcesses(context.getPackageName());
System.exit(0);
android.os.Process.killProcess(android.os.Process.myPid());
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 获取栈顶Activity
*
* @return 栈顶Activity
*/
public Activity getTopActivity() {
try {
Class activityThreadClass = Class.forName("android.app.ActivityThread");
Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null);
Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
activitiesField.setAccessible(true);
Map activities;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
activities = (HashMap) activitiesField.get(activityThread);
} else {
activities = (ArrayMap) activitiesField.get(activityThread);
}
for (Object activityRecord : activities.values()) {
Class activityRecordClass = activityRecord.getClass();
Field pausedField = activityRecordClass.getDeclaredField("paused");
pausedField.setAccessible(true);
if (!pausedField.getBoolean(activityRecord)) {
Field activityField = activityRecordClass.getDeclaredField("activity");
activityField.setAccessible(true);
return (Activity) activityField.get(activityRecord);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取launcher activity
*
* @param packageName 包名
* @param context 上下文
* @return launcher activity
*/
public String getLauncherActivity( Context context, String packageName) {
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PackageManager pm = context.getPackageManager();
List
info = pm.queryIntentActivities(intent, 0);
for (ResolveInfo aInfo : info) {
if (aInfo.activityInfo.packageName.equals(packageName)) {
return aInfo.activityInfo.name;
}
}
return "no " + packageName;
}
}