谷歌已弃用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
众所周知,当我们在Android 6.0中拒绝运行时的权限并从最近的菜单中恢复应用程序时,应用程序进程将被终止,应用程序将被强制重新启动.据称这是为了防止任何安全问题:
值得注意的是,当恢复时,应用程序会从最后一次重新开始Activity.操作系统显然跟踪Activity用户访问的最后一次.
不幸的是,这是一个问题,因为它打破了业务逻辑的流程.不允许用户以这种方式中途访问应用程序.
我的问题是,有没有办法强制应用程序从Activity应用程序的第一个重新启动,而不是用户将其保留的应用程序?
是否有与应用程序重启/进程终止/权限切换相关的回调?
这是一种错误的做法吗?如果是这样,怎么样?什么是正确的方法?
这种行为当然在以前被观察过:
2. 启用/禁用Android M nexus 6上的设置权限后,应用程序将被终止
android android-activity android-permissions activity-manager android-6.0-marshmallow
我使用以下代码在变量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) 我正在尝试确定用户当前可见的应用程序.为此,我使用该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中的推送通知,我使用下面的方法来显示通知,但问题是现在ActivityManager.getRunningTasks(1); 正在被弃用.从一个计算器问题,我读到:"你可以用getAppTasks()返回一个List<AppTask>在那里你可以得到RecentTaskInfo与getTaskInfo"但我不能弄清楚如何使用它.在这方面请帮帮我.
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) 如何获取应用程序中正在设备上运行的所有活动的列表.
例如:包括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)
但是,这将提供有关作为最高活动的运行活动的信息.
我的想法是将运行的活动列入白名单,以便我的第三方应用程序可以在设备上运行它.所以我基本上需要应用程序中的所有运行活动.
我正在尝试做类似文件管理器的事情.在行动栏我想做"谷歌驱动"应用程序中的文件夹导航.我需要创建方法,可以从最后的数字或类似的东西前往活动.
例:
所以,如果我有堆栈:[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) 我在我的应用程序中打开一个链接,一旦按下后我想显示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)
我也试过isTaskRoot但结果是一样的.它没有给出正确的答案.请帮助
android android-intent android-activity back-stack activity-manager
通过流程我的意思是我们提供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)
我想获得所有正在运行的应用程序的应用程序名称 所以这就是我在查看各种来源后所做的事情(并且有效).
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是进程运行的名称.所以我们基本上使用进程名称作为包名来获取应用程序信息.
我想以编程方式删除我的应用程序的数据.我找到了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)
有一种方法可以使用此方法擦除数据而不会最小化应用程序?