谷歌已弃用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
我正在尝试获取应用程序启动的统计信息,并且在Lollipop上可以通过使用UsageStatsManager类来实现(原始帖子在这里):
表现:
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions"/>
Run Code Online (Sandbox Code Playgroud)
打开活动,让用户确认给您这个权限:
startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));
Run Code Online (Sandbox Code Playgroud)
获取统计数据,汇总:
private static final String USAGE_STATS_SERVICE ="usagestats"; // Context.USAGE_STATS_SERVICE);
...
final UsageStatsManager usageStatsManager=(UsageStatsManager)context.getSystemService(USAGE_STATS_SERVICE);
final Map<String,UsageStats> queryUsageStats=usageStatsManager.queryAndAggregateUsageStats(fromTime,toTime);
Run Code Online (Sandbox Code Playgroud)
我似乎无法检查是否授予您所需的权限("android.permission.PACKAGE_USAGE_STATS").到目前为止我所做的一切总是会让人感到被拒绝.
代码有效,但权限检查不起作用.
您可以使用以下任一方法检查是否授予了权限:
String permission = "android.permission.PACKAGE_USAGE_STATS";
boolean granted=getContext().checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
Run Code Online (Sandbox Code Playgroud)
或这个:
String permission = "android.permission.PACKAGE_USAGE_STATS";
boolean granted=getPackageManager().checkPermission(permission,getPackageName())== PackageManager.PERMISSION_GRANTED;
Run Code Online (Sandbox Code Playgroud)
两者总是返回它被拒绝(即使我已经授予用户权限).
看看UsageStatsManager的代码,我试图想出这个解决方法:
UsageStatsManager usm=(UsageStatsManager)getSystemService("usagestats");
Calendar calendar=Calendar.getInstance();
long toTime=calendar.getTimeInMillis();
calendar.add(Calendar.YEAR,-1);
long fromTime=calendar.getTimeInMillis();
final List<UsageStats> queryUsageStats=usm.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,fromTime,toTime);
boolean granted=queryUsageStats!=null&&queryUsageStats!=Collections.EMPTY_LIST;
Run Code Online (Sandbox Code Playgroud)
它工作,但它仍然是一个解决方法.
为什么我没有得到权限检查的正确结果?
应该怎么做才能更好地检查?
permissions android usage-statistics android-recents usagestatsmanager
由于显示敏感数据,我主要想在最近的应用列表中清空屏幕.为此,解决方案是使用:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
Run Code Online (Sandbox Code Playgroud)
但这也不允许截图,这是一个问题.
有没有办法在最近的应用程序列表中显示空白屏幕(或预定义的图像),同时仍然允许截图?
我正在开发一个音乐应用程序,我想在用户从最近的列表中删除应用程序时停止服务,而不是在第一个活动被销毁时停止服务(因为当用户点击回来直到应用程序最小化时,在这种情况下,第一个活动也是被摧毁).请帮忙.
可能重复: 如何在ICS中的最近应用列表中不显示应用?excludeFromRecents不起作用
假设我有两个活动A(主要活动)和B.我从A开始B如下:
Intent i = new Intent(A.this, B.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
我希望我的应用程序在任何时候只有一个条目,并且B将在新任务中启动.如果B有如下的清单条目,我实现了:
<activity
android:name="com.example.verysimpleactivity2.app.B"
android:excludeFromRecents="true"
android:label="B" ></activity>
Run Code Online (Sandbox Code Playgroud)
但我也希望B具有与主要活动不同的taskAffinity,即A.所以我将清单条目更改为:
<activity
android:name="com.example.verysimpleactivity2.app.B"
android:excludeFromRecents="true"
android:taskAffinity=""
android:label="B" ></activity>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果B不在前景中,那么它不会显示在最近,我只有A(好!)但是,如果B在前景中并按下最近按钮,我看到A和B都在那里.为什么在这种情况下B显示在最近?如何确保我根本看不到B?
我的应用程序的测试人员报告说:"最近的应用程序列表中的应用程序的缩略图根本没有调整.在我看来它像主屏幕壁纸(tolikdru:可能,只是透明的rect),或者像应用程序的绿色背景屏幕,但从来不是应用程序的真实快照." 所以行为就像这里描述的那样.
我的设备是使用Android 2.0,所以我无法检查和调试问题(最近的应用程序中的缩略图是自Android 3.0+以来).因此,进一步的研究处于"盲目模式".
我决定用onCreateThumbnail手动强制应用程序缩略图的创建()作为这里建议.(为了简化开始的任务,我没有捕获真正的快照,而是使用splashscreen drawable.)
@Override
public boolean onCreateThumbnail(Bitmap outBitmap, Canvas thumbCanvas) {
super.onCreateThumbnail(outBitmap, thumbCanvas);
//splashscreen drawable to bitmap
outBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.titel);
//automatically scale to provided canvas
//(is the canvas provided as input ???)
thumbCanvas.drawBitmap(outBitmap, 0, 0, new Paint());
//is the outBitmap itself scaled to canvas or its copy???
return true;
}
Run Code Online (Sandbox Code Playgroud)
我不确定上面的代码是否正确,因为我无法测试它(见下文).
根据文档,另一个可能的解决方案可能只是一个虚拟的@Override onCreateThumbnail,里面只有super.onCreateThumbnail(),因为文档说:
默认实现返回失败,并且不绘制缩略图; 这将导致平台 在需要时创建自己的缩略图.
但是onCreateThumbnail方法并没有触发,至少在我的Android 2上.实际上这个技巧是针对Android 3+设计的.这里(2012年) 和此处(2009年)报道了相同的情况.在这两种情况下都没有使用Android版本.
那么请你帮忙解答一下问题:
1)上面的代码是否适用于在最近的应用列表中使用缩略图的Android 3+设备? …
在我的一个应用程序中,我看到了很奇怪的行为:当我的应用程序在前台运行时(最顶层),然后我可以在系统的最近看到它的活动.但是一旦我把它放到后台,AccountsActivity很久以前列出的相同活动(即)就不再存在于最近.我的清单文件的相关部分:
<application
android:name=".WebnetApplication"
android:allowBackup="false"
android:allowClearUserData="true"
android:hardwareAccelerated="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".StartActivity"
android:alwaysRetainTaskState="true"
android:excludeFromRecents="true"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoDisplay" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".AccountsActivity"
android:excludeFromRecents="false"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize" />
...
Run Code Online (Sandbox Code Playgroud)
由于这是我唯一一个行为不端的应用程序,我检查了所有样式,我的WebnetActivity并WebnetApplication确保我不会调用任何可能影响最近的东西.没有这样的.
然后我开始删除Manifest文件以查看是否会发生变化.正如预期的那样,罪魁祸首潜伏在那里,但对我来说仍然不是很清楚.在开始时,AccountsActivityManifest中的android:excludeFromRecents条目根本没有条目 - 这导致在AccountsActivity根本不可见.当我添加时android:excludeFromRecents="true",活动在"最近"中变得可见,但只有当它在前面时才会显示.当我向后移动时,它从最近消失了.当我android:excludeFromRecents="true"从StartActivity声明中删除时,AccountsActivity无论应用程序是在前面还是在后台,都可以在最近显示,我可以android:excludeFromRecents完全删除它的条目而没有任何问题.
目前我正在弯着脑子试图理解为什么一切都这样 - 这是正常的(我不知道什么)或者它可能是框架中的错误?任何人都面临类似的问题,可以分享经验,想法或解释?
自Android Lollipop以来,我们现在拥有一个用于访问应用使用情况统计数据的API.但是,您的应用必须由用户授予这些权限.
我知道使用Settings.ACTION_USAGE_ACCESS_SETTINGS将用户重定向到这些设置.
现在,我的问题是您如何知道用户已授予您这些权限,以便您可以停止将其重定向到设置.
谢谢!
android usage-statistics android-recents android-5.0-lollipop
我有一个应用程序有两个活动A和B,都有启动模式singleInstance.我注意到即使A和B都在后台运行,最近的应用列表中也只会显示最后一个活动.是否可以将A&B保留在最近的应用列表中?谢谢.
我知道它应该可以android:excludeFromRecents="true"在android manifest或Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTSIntent标志中实现.
问题是,如果当前正在显示应用程序,则无效 - 当单击"最近的应用程序"按钮时,应用程序始终显示在首位,允许快速查杀应用程序(通过滑动它).不适合闹钟应用.
幸运的是,音乐服务继续播放,用户可以通过通知回到完成警报,但我真的很难重新创建活动堆栈.
有没有快速解决方案?