标签: activity-manager

如何使用UsageStatsManager?

背景

谷歌已弃用getRecentTasks"ActivityManager"类的功能" ".现在它所做的只是获取当前应用程序已打开的应用程序列表.

我甚至在StackOverflow上写了一篇关于它的帖子,但我发现这是不可能的.

问题

我发了一篇关于它的帖子(在这里,另一个,类似的由其他人创建,在这里),并要求重新考虑它,谷歌决定创建一个新类,似乎提供类似的功能(更像是统计,但也可能有用),但我无法找到如何使用它.

该类称为" UsageStatsManager",我的猜测是函数" queryUsageStats"完成工作.

此外,它似乎有一个新的权限(" android.permission.PACKAGE_USAGE_STATS"),这是一个系统权限,但它写道:

声明权限意味着使用API​​的意图,设备用户可以通过Settings应用程序授予权限.

这是关于这个新功能另一个链接.

我发现了什么

我查看了Android的代码,并注意到"Context"有USAGE_STATS_SERVICE,在JavaDocs中说下一件事:

/**
 * Use with {@link #getSystemService} to retrieve a {@link
 * android.app.UsageStatsManager} for interacting with the status bar.
 *
 * @see #getSystemService
 * @see android.app.UsageStatsManager
 * @hide
 */
public static final String USAGE_STATS_SERVICE = "usagestats";
Run Code Online (Sandbox Code Playgroud)

奇怪的是,不仅它说" status bar",而且packageName也不匹配(应该是" android.app.usage.UsageStatsManager").

我还添加了正确的权限:

<uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />
Run Code Online (Sandbox Code Playgroud)

这是我使用的代码:

  final UsageStatsManager …
Run Code Online (Sandbox Code Playgroud)

android usage-statistics activity-manager android-recents usagestatsmanager

52
推荐指数
5
解决办法
5万
查看次数

强制应用程序从第一个Activity重新启动(当权限被拒绝时)

众所周知,当我们在Android 6.0中拒绝运行时的权限并从最近的菜单中恢复应用程序时,应用程序进程将被终止,应用程序将被强制重新启动.据称这是为了防止任何安全问题:

在此输入图像描述

值得注意的是,当恢复时,应用程序会从最后一次重新开始Activity.操作系统显然跟踪Activity用户访问的最后一次.

不幸的是,这是一个问题,因为它打破了业务逻辑的流程.不允许用户以这种方式中途访问应用程序.

我的问题是,有没有办法强制应用程序从Activity应用程序的第一个重新启动,而不是用户将其保留的应用程序?

是否有与应用程序重启/进程终止/权限切换相关的回调?

这是一种错误的做法吗?如果是这样,怎么样?什么是正确的方法?

这种行为当然在以前被观察过:

1. Android预览M:在权限授予后重新创建活动

2. 启用/禁用Android M nexus 6上的设置权限后,应用程序将被终止

3. Android Marshmallow:运行应用程序的权限更改

4. 按"重置应用偏好设置"后,我的应用的所有权限都被撤消

5. Android 6权限 - 在设置中切换权限时崩溃并返回应用程序

android android-activity android-permissions activity-manager android-6.0-marshmallow

22
推荐指数
1
解决办法
3667
查看次数

无法在Android Lollipop 5.0中获取前台活动名称

我使用以下代码在变量foregroundTaskPackageName中获取前台应用程序的活动名称.它适用于4.1到4.4之间的所有操作系统版本,但在Android 5.0 Lollipop中不起作用.

任何人都可以帮助5.0 Lollipop中的变化吗?在Lollipop中 - 我为foregroundTaskPackageName获取的文本只是'Launcher3'.我正在使用Genymotion仿真器.

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0); // get
                                                                        // list
                                                                        // of
                                                                        // running
                                                                        // tasks
String foregroundTaskAppName = null;
String foregroundTaskPackageName = foregroundTaskInfo.topActivity
                .getPackageName();
Run Code Online (Sandbox Code Playgroud)

android activity-manager android-5.0-lollipop

21
推荐指数
3
解决办法
2万
查看次数

使用activityManager.getRunningAppProcesses()获取(实际)前台进程

我正在尝试确定用户当前可见的应用程序.为此,我使用该activityManager.getRunningAppProcesses()方法.

我知道Android 5.1.1不支持该方法 - 这没关系.

一开始它就像魅力一样,我正在迭代RunningAppProcessInfos列表并检查重要性.

tl; dr获取当前前台进程和防止错误postives的正确方法是什么?如何完成列表的顺序 - API说它没有指定.有没有办法正确订购它们?

我做了什么:

不幸的是,ActivityManager返回的列表在每个设备上都是不同的.某些设备返回具有重要性100(即FOREGROUND)的多个信息,即使该过程当前不可见.

这引起了我有很多误报的问题.例如,我每次用facebook测试它并创建一个吐司,每次facebook都在前台.我切换到Home,所以我的启动器应该是前台进程.这是10秒之后,在那之后,facebook又重新出现在列表中的FOREGROUND(它不是开放也不可见)而且我得到了误报.

我认识到有些设备按照最近的流程排序列表.所以我决定尝试以下方法:

ActivityManager.RunningAppProcessInfo appProcess = appProcesses.get(0);
        final String processName = appProcess.processName;
        final String packageName = removeProcessSuffix(processName);
        if (appProcess.importance == FOREGROUND || appProcess.importance == VISIBLE){
            //do something, like the toast
        }
Run Code Online (Sandbox Code Playgroud)

使用appProcesses.get(0); 我只检查第一个元素,然后bug就消失了.再也没有误报了.

但是,现在在某些设备上,我根本不再获得前台进程.因为他们没有以任何方式订购列表.例如,一些4.2索尼智能手机是一些候选人.我得到了列表,但当前可见的进程是索引11左右.

我不知道该怎么做,以获得当前的前台进程,没有误报.

获取当前前台进程并防止错误假设的正确方法是什么?如何完成列表的顺序 - API说它没有指定.有没有办法正确订购它们?

谢谢!

android process activity-manager

19
推荐指数
1
解决办法
1571
查看次数

不推荐使用ActivityManager.getRunningTasks

我正在android中的推送通知,我使用下面的方法来显示通知,但问题是现在ActivityManager.getRunningTasks(1); 正在被弃用.从一个计算器问题,我读到:"你可以用getAppTasks()返回一个List<AppTask>在那里你可以得到RecentTaskInfogetTaskInfo"但我不能弄清楚如何使用它.在这方面请帮帮我.

private void postNotification(Context ctx, Intent intent) {
        try {
            if (intent == null) {
                Log.d(TAG, "Receiver intent null");
            } else {
                String action = intent.getAction();
                if (action.equals("com.ziza.cy.UPDATE_STATUS")) {

                    JSONObject json = new JSONObject(intent.getExtras()
                            .getString("com.parse.Data"));

                    String type = json.getString("type");

                    if (type.equals("AlertNotification")) {

                        String msg = json.getString("header");
                        String title = "ncy";

                        ActivityManager am = (ActivityManager) ctx
                                .getSystemService(Context.ACTIVITY_SERVICE);
                        List<RunningTaskInfo> taskInfo = am.getRunningTasks(1);
                        ComponentName componentInfo = taskInfo.get(0).topActivity;

                        // don't show notification if app is …
Run Code Online (Sandbox Code Playgroud)

android deprecated push-notification activity-manager

17
推荐指数
3
解决办法
3万
查看次数

我们的应用程序中正在设备上运行的所有活动的列表

如何获取应用程序中正在设备上运行的所有活动的列表.

例如:包括pdf生成和电子邮件活动.

我可以使用以下代码检查活动:

ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);

     // get the info from the currently running task

     List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);

     Log.d("topActivity", "CURRENT Activity ::"

             + taskInfo.get(0).topActivity.getClassName());

     ComponentName componentInfo = taskInfo.get(0).topActivity;

   componentInfo.getPackageName();
Run Code Online (Sandbox Code Playgroud)

但是,这将提供有关作为最高活动的运行活动的信息.

我的想法是将运行的活动列入白名单,以便我的第三方应用程序可以在设备上运行它.所以我基本上需要应用程序中的所有运行活动.

android activity-manager

14
推荐指数
1
解决办法
2万
查看次数

从堆栈返回特定活动

我正在尝试做类似文件管理器的事情.在行动栏我想做"谷歌驱动"应用程序中的文件夹导航.我需要创建方法,可以从最后的数字或类似的东西前往活动.

例:

所以,如果我有堆栈:[1] - > [2] - > [3] - > [4] - > [5]

我需要去第二个:所以我需要从堆栈中删除[3],[4]和[5]并转到[2].

所有活动都是一个类ContentActivity.java.

怎么可能呢?

更新:

一些代码我如何开始活动:

public class ContentActivity extends Activity implements AdapterView.OnItemClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        Intent intent = getIntent();
        String folderToOpen = intent.getStringExtra("folderName");
        fillList(folderToOpen);
    }


    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        ...
        Intent intent = new Intent(ContentList.this, ContentList.class);
        intent.putExtra("folderName", item.getName());
        startActivity(intent);
    }
}
Run Code Online (Sandbox Code Playgroud)

android android-activity activity-manager

13
推荐指数
2
解决办法
8569
查看次数

如何查找活动是否是堆栈中的最后一个活动

我在我的应用程序中打开一个链接,一旦按下后我想显示HomePage以保留用户更多时间.我一直在努力实现这一目标但却无法做到这一点.我将homeLauncher活动作为我的top和baseActivity.

DeepLink Tap>打开所需的活动>用户按下后退按钮>检查其上一个活动但不是homeActivity>如果是,请将用户导航到homeActivity.

尝试以下代码:

@Override
public void onBackPressed() {
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);

if(taskList.get(0).numActivities == 1 && taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())){
  //// This is last activity
}
else{
    //// There are more activities in stack
}

super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)

Android Studio Evalation

我也试过isTaskRoot但结果是一样的.它没有给出正确的答案.请帮助

android android-intent android-activity back-stack activity-manager

13
推荐指数
2
解决办法
4540
查看次数

进程名称是否与android中的包名相同?

通过流程我的意思是我们提供android:process的包装和包装我的意思是包装

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.osg.appkiller"
    android:versionCode="1"
    android:versionName="1.0" >
Run Code Online (Sandbox Code Playgroud)

更多细节进程和线程 - Android开发人员

我想获得所有正在运行的应用程序的应用程序名称 所以这就是我在查看各种来源后所做的事情(并且有效).

    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    PackageManager packageManager = getPackageManager();
    final List<RunningAppProcessInfo> runningProcesses = activityManager.getRunningAppProcesses();
    for(RunningAppProcessInfo processInfo : runningProcesses) {
        CharSequence appName = null;
        try {
            appName = packageManager.getApplicationLabel(packageManager.getApplicationInfo(processInfo.processName, PackageManager.GET_META_DATA));
        } catch (NameNotFoundException e) {
            Log.e(TAG,"Application info not found for process : " + processInfo.processName,e);
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果您看到PackageManager.getApplicationInfo的文档

ApplicationInfo android.content.pm.PackageManager.getApplicationInfo(String packageName, int flags) throws NameNotFoundException
Run Code Online (Sandbox Code Playgroud)

但我过世了

processInfo.processName
Run Code Online (Sandbox Code Playgroud)

其中processName是进程运行的名称.所以我们基本上使用进程名称作为包名来获取应用程序信息.

  1. 首先是这种方法是正确的吗?
  2. 其次,如果我们不为活动/服务等提供流程,那么创建与包名相同名称的新流程是真的吗?

android process task activity-manager

9
推荐指数
1
解决办法
4066
查看次数

clearApplicationUserData最小化应用程序

我想以编程方式删除我的应用程序的数据.我找到了clearApplicationUserData方法.但是当我运行它时,应用程序最小化了自己.也就是说,应用程序转到后台,就像按下主页按钮一样.这是我的代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    ((ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE))
                        .clearApplicationUserData();
} else {
        // TODO
}
Run Code Online (Sandbox Code Playgroud)

有一种方法可以使用此方法擦除数据而不会最小化应用程序?

android activity-manager

9
推荐指数
1
解决办法
3961
查看次数