我的应用程序允许在最近推出时对应用列表进行排序.
从Android"L"开始,函数getRecentTasks将返回当前应用程序已启动的应用程序列表,如文档中所述:
如果您的应用使用ActivityManager.getRecentTasks()...
通过在即将发布的版本中引入新的并发文档和活动任务功能(请参阅下面的"最近的并发文档和活动"屏幕),现在不推荐使用ActivityManager.getRecentTasks()方法来提高用户隐私.为了向后兼容,此方法仍然返回其数据的一小部分,包括调用应用程序自己的任务以及可能的一些其他非敏感任务(例如Home).如果您的应用使用此方法检索自己的任务,请使用android.app.ActivityManager.getAppTasks()来检索该信息.
使用ADT显示此功能的文档(当前在Internet上不可用)时写入相同内容:
不推荐使用此方法.从L开始,此方法不再适用于第三方应用程序:因为引入以文档为中心的最新版本意味着它可能会将个人信息泄露给调用者.为了向后兼容,它仍将返回其数据的一小部分:至少是调用者自己的任务(尽管请参阅getAppTasks()以获取正确支持的方式来检索该信息),并且可能还有一些其他任务,例如home已知的不敏感.
我不明白为什么采取这种行为,因为很容易看到用户拥有哪些应用程序,甚至没有任何许可.
事实上,这是我添加的这个功能的一大限制,所以我希望有办法克服这个问题.
目前,我只使用了一种关于最近推出了哪些应用程序的启发式方法 - 我得到了正在运行的进程列表.
我也可以使用流程的重要性值,也许还可以使用"importanceReasonComponent",但这只是所有的启发式和猜测......
有没有办法克服这个限制?我没有想到的任何解决方法?
也许这有可能与root?还是BusyBox?
服务已实现onTaskRemoved()方法.
当通过swipe从recent-apps-list中删除应用程序时调用startService()onTaskRemoved()时启动服务.
但是如果服务以bindService()开头,则onTaskRemoved()从不调用.
如何在使用bindService()启动应用程序后,通过轻扫将应用程序从recent-apps-list中删除,从而调用onTaskRemoved()?
以下方法调用如果以下:
1. bindService():
Activity? onCreate()
CustomService? onCreate()
CustomService? onStart()
CustomService? onStartCommand()
CustomService? onBind()
// Here we swipe to remove app from recent-apps-list
CustomService? onTrimMemory()
2. startService():
ActivityA? onCreate()
CustomService? onCreate()
CustomService? onStart()
CustomService? onStartCommand()
CustomService? onBind()
// Swipe to remove app from recent-apps-list
CustomService? onTrimMemory()
CustomService? onTaskRemoved() // <=====
CustomService? onUnbind()
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,其中包含在后台运行的活动和意图服务.
还有一个通知,显示进度条与后台进程的进度(它从服务器下载了大量文件).
该活动具有下载进度(用户在下载这些资产之前无法有意义地使用该应用程序).关闭此活动时,将显示带有进度条的通知.
我的问题:当应用程序被"任务管理器"(可通过android 4.0上的右键,具有两个矩形的那个)访问时,通知仍然存在.但它基本上是一个僵尸,因为用于更新它的服务已经死了.
换一种方式:当我的应用程序被杀死时,如何删除(或所有)通知?
我正在创建一个显示notification当前播放歌曲的应用程序.
歌曲正在播放Service,并且通知的启动和取消在服务本身中完成.
但是如果应用程序因某些异常而终止,或者我通过任务管理器强制关闭它,则通知仍然位于任务栏的顶部.
我该如何删除它.
以下是代码:
//In Service onStartCommand(), there is a call to initiatePlayback()
private void initiatePlayback() {
try {
if (mPlayer.isPlaying()) {
mPlayer.stop();
}
mPlayer.reset();
mPlayer.setDataSource(currentData);
mPlayer.prepare();
if (reqAudioFocus()) {
mPlayer.start();
}
if (mPlayer.isPlaying()) {
initNotification();
}
} catch (Exception e) {
Toast.makeText(this,
"PlayTrack->initiatePlayback(): " + e.toString(),
Toast.LENGTH_SHORT).show();
}
}
@Override
public void onDestroy() {
stopPlayback();
mPlayer.release();
mPlayer = null;
super.onDestroy();
}
private void stopPlayback() {
if (mPlayer.isPlaying()) {
mPlayer.stop();
mPlayer.reset();
cancelNotification();
}
}
private …Run Code Online (Sandbox Code Playgroud)