获取最顶端的Top Activity和类名

1.我找了很多方法,以下是

    《1》5.0之后 获取top activity  很多方法停用,用是可以用,但是有些条件下 获取是异常的,比如我这个是断网情况下,获取是异常的,我之前用的 是

public String getTopActivityPackageName(Context context) {
    String topActivityPackage = null;
    ActivityManager activityManager = (ActivityManager) (context
            .getSystemService(android.content.Context.ACTIVITY_SERVICE));
    List<RunningTaskInfo> runningTaskInfos = activityManager
            .getRunningTasks(1);
    if (runningTaskInfos != null) {
        ComponentName f = runningTaskInfos.get(0).topActivity;
        topActivityPackage = f.getPackageName();
    }
    return topActivityPackage;
}

到了断网,获取出来的就是launcher ,我去,我要的是我自己app的top acticity,这个拿到我没法用。

     《2》获取权限,这个是可行的

<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.dumaisoft.wxb.gettopactivity">
    <application
    ...
</application>
<!--注意这里:添加权限-->
<uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions"/>
</manifest>
之后就是
//检测用户是否对本app开启了“Apps with usage access”权限
private boolean hasPermission() {
    AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
    int mode = 0;
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT)
    {
        mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(),         getPackageName());
    }
    return mode == AppOpsManager.MODE_ALLOWED;
}
之后
private static final int MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS = 1101;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (requestCode == MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS)
    {
        if (!hasPermission()) {
            //若用户未开启权限,则引导用户开启“Apps with usage access”权限 
            startActivityForResult( new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS), MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS);
        }
    }
}

之后

private void getTopApp(Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        UsageStatsManager m = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
        if (m != null) {
            long now = System.currentTimeMillis();
            //获取60秒之内的应用数据
            List<UsageStats> stats = m.queryUsageStats(UsageStatsManager.INTERVAL_BEST, now - 60 * 1000, now);
            Log.i(TAG, "Running app number in last 60 seconds : " + stats.size());
            String topActivity = "";
            //取得最近运行的一个app,即当前运行的app
            if ((stats != null) && (!stats.isEmpty())) {
                int j = 0;
                for (int i = 0; i < stats.size(); i++) {
                    if (stats.get(i).getLastTimeUsed() > stats.get(j).getLastTimeUsed()) {
                        j = i;
                    }
                }
                topActivity = stats.get(j).getPackageName();
            }
            Log.i(TAG, "top running app is : "+topActivity);
        }
    }
}
就可以了 ,问题是 这个要跑到设置里面,用户自己设置,这个很烦的。
    《3》activity管理类 这个你百度 就可以看到很多,我看了一下,感觉 要写好多代码,就不想写了,我的app也不用管理 

***********************************************我自己的方法了****************************************************************

在Application的onCreat中添加:

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    }

    @Override
    public void onActivityStarted(Activity activity) {

    }

    @Override
    public void onActivityResumed(Activity activity) {
        topActivity=activity.getClass().getName();
    }

    @Override
    public void onActivityPaused(Activity activity) {

    }

    @Override
    public void onActivityStopped(Activity activity) {

    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

    }

    @Override
    public void onActivityDestroyed(Activity activity) {
    }
});
我想要的是类名,因为 我的程序里面要判断是否是top activity,所以我这里是String,如果你是activity,你看到了,这里也是有activity的。
在application中添加方法:

public boolean isTopActivity(String TAG){
    if(TextUtils.isEmpty(topActivity))
        return false;
    return topActivity.contains(TAG);
}

大功告成。





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值