方式一:
/**
* 在Application内添加监听
*/
public void registerListenerLifecycle(){
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
}
@Override
public void onActivityResumed(@NonNull Activity activity) {
}
@Override
public void onActivityPaused(@NonNull Activity activity) {
}
@Override
public void onActivityStopped(@NonNull Activity activity) {
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
}
});
}
方式二:
替换Instrumentation
//在 Application内初始化
public class TopActivityGet {
private TopActivityGet(){}
private static TopActivityGet instance;
private static CInstrumentation cInstrumentation;
private Activity activity;
public static TopActivityGet getInstance(){
if (instance == null){
synchronized (TopActivityGet.class){
if (instance == null){
instance = new TopActivityGet();
init();
}
}
}
return instance;
}
private static void init(){
try {
cInstrumentation = new CInstrumentation();
Class cls = Class.forName("android.app.ActivityThread"); // ActivityThread被隐藏了,所以通过这种方式获得class对象
Method mthd = cls.getDeclaredMethod("currentActivityThread", (Class[]) null); // 获取当前ActivityThread对象引用
Object currentAT = null;
currentAT = mthd.invoke(null, (Object[]) null);
Field mInstrumentation = currentAT.getClass().getDeclaredField("mInstrumentation");
mInstrumentation.setAccessible(true);//设置private变量为可读取
mInstrumentation.set(currentAT, cInstrumentation); // 修改ActivityThread.mInstrumentation值
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public Activity getTopActivity(){
return activity;
}
public void setTopActivity(Activity activity){
this.activity = activity;
}
}
public class CInstrumentation extends Instrumentation {
@Override
public void callActivityOnResume(Activity activity) {
super.callActivityOnResume(activity);
TopActivityGet.getInstance().setTopActivity(activity);
}
}
监听其他应用的最高Activity:需要向用户申请权限
public class AppMonitoringService extends AbsWorkService {
private UsageStatsManager manager;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
manager = (UsageStatsManager) getSystemService(USAGE_STATS_SERVICE);
startMonitoring();
return START_STICKY;
}
//....
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void startMonitoring(){
UsageEvents usageEvents = manager.queryEvents(startTime, endTime);
UsageEvents.Event event = new UsageEvents.Event();
//遍历这个事件集合,如果还有下一个事件
while (usageEvents.hasNextEvent()){
//得到下一个事件放入event中,先得得到下个一事件,如果这个时候直接调用,则 event的package是null,type是0。
usageEvents.getNextEvent(event);
//如果这是个将应用置于前台的事件
if(event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND){
//.............
}
}
}
}