-
运行环境
1、下面案例在系统签名下可以运行 版本:Android 11
2、注意:我尝试在没有系统签名下打开
//代码中
File xmlFile = new File("/data/system_ce/0/recent_tasks/33_task.xml");
会报以下错误
2023-04-10 16:23:38.278 4411-4438/com.example.myapplication W/System.err: java.io.FileNotFoundException: /data/system_ce/0/recent_tasks/33_task.xml: open failed: EACCES (Permission denied)
2023-04-10 16:23:38.279 4411-4438/com.example.myapplication W/System.err: at libcore.io.IoBridge.open(IoBridge.java:492)
2023-04-10 16:23:38.279 4411-4438/com.example.myapplication W/System.err: at java.io.FileInputStream.<init>(FileInputStream.java:160)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
目前还找不到解决方法、猜测是谷歌做了限制
-
目录保存位置
1、可以了解一下进程的xml文件位置 /data/system_ce/0/recent_tasks/296_task.xml
2、任务缩略图片位置 /data/system_ce/0/snapshots
For example: 296_task.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<task affinity="10030:us.zoom.videomeetings"
asked_compat_mode="false"
auto_remove_recents="false"
calling_feature_id="" calling_package="us.zoom.videomeetings"
calling_uid="10030" effective_uid="10030"
last_time_moved="1681107927186" min_height="-1"
min_width="-1" never_relinquish_identity="true"
next_affiliation="-1"
persist_task_version="1" prev_affiliation="-1"
real_activity="us.zoom.videomeetings/com.zipow.videobox.LauncherActivity"
real_activity_suspended="false" resize_mode="2"
root_has_reset="true" supports_picture_in_picture="false"
task_affiliation="296" task_affiliation_color="-13026995"
task_description_color="ff39394d" task_description_colorBackground="ffffffff"
task_id="296"
user_id="0" user_setup_complete="true">
<intent action="android.intent.action.MAIN"
component="us.zoom.videomeetings/com.zipow.videobox.LauncherActivity"
flags="10200000">
<categories category="android.intent.category.LAUNCHER" />
</intent>
</task>
这里着重看一下
real_activity="us.zoom.videomeetings/com.zipow.videobox.LauncherActivity"
task_id="296"
public void getAppTasks(ObservableEmitter<List<TaskBean>> observableEmitter) {
this.isExist = false;
PackageManager packageManager = this.mContext.getPackageManager();
ArrayList<TaskBean> arrayList = new ArrayList<>();
List<ActivityManager.RecentTaskInfo> recentTasks =
this.activityManager.getRecentTasks(18, 2);
if (recentTasks == null || recentTasks.size() == 0) {
observableEmitter.onNext(arrayList);
return; }
for (ActivityManager.RecentTaskInfo recentTaskInfo : recentTasks) {
ResolveInfo resolveActivity =
packageManager.resolveActivity(recentTaskInfo.baseIntent, 0);
String str = resolveActivity.activityInfo.packageName;
if (!isNotShowApp(this.mContext, str)) {
TaskBean taskBean = new TaskBean();
taskBean.setBaseIntent(recentTaskInfo.baseIntent);
taskBean.setName(resolveActivity.loadLabel(packageManager).toString());
String appTaskThumbnail =
"/data/system_ce/0/snapshots/"+recentTaskInfo.persistentId+"_reduced.jpg";
taskBean.setThumb(appTaskThumbnail);
taskBean.setIcon(getAppIcon(this.mContext, str));
taskBean.setPackageName(str);
taskBean.setId(recentTaskInfo.id);
taskBean.setPersistentId(recentTaskInfo.persistentId);
taskBean.setClassName(resolveActivity.activityInfo.name);
arrayList.add(taskBean);
}
}
observableEmitter.onNext(arrayList);
}
public class TaskBean {
private Intent baseIntent;
private String className;
private Drawable icon;
private int id;
private String name;
private String packageName;
private int persistentId;
private String thumb;
public int getId() {
return this.id;
}
public void setId(int i) {
this.id = i;
}
public int getPersistentId() {
return this.persistentId;
}
public void setPersistentId(int i) {
this.persistentId = i;
}
public String getName() {
return this.name;
}
public void setName(String str) {
this.name = str;
}
public Drawable getIcon() {
return this.icon;
}
public void setIcon(Drawable drawable) {
this.icon = drawable;
}
public String getThumb() {
return this.thumb;
}
public void setThumb(String str) {
this.thumb = str;
}
public String getPackageName() {
return this.packageName;
}
public void setPackageName(String str) {
this.packageName = str;
}
public String getClassName() {
return this.className;
}
public void setClassName(String str) {
this.className = str;
}
public Intent getBaseIntent() {
return this.baseIntent;
}
public void setBaseIntent(Intent intent) {
this.baseIntent = intent;
}
}
public void bindTask(TaskBean taskBean) {
this.mIvAppIcon.setImageDrawable(taskBean.getIcon());
this.mTvAppName.setText(taskBean.getName());
String thumb = taskBean.getThumb();
if (TextUtils.isEmpty(thumb)) {
return;
}
File file = new File(thumb);
if (file.exists() && file.isFile()) {
this.mIvTaskSnapShot.setImageBitmap(BitmapFactory.decodeFile(thumb));
}
}
//itemView xml文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/rl_container"
android:layout_width="680px"
android:layout_height="wrap_content"
android:layout_margin="24px"
android:clipChildren="false"
android:clipToPadding="false"
android:pointerIcon="hand">
<LinearLayout
android:id="@+id/ll_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingVertical="20px">
<ImageView
android:id="@+id/iv_app_icon"
android:layout_width="40px"
android:layout_height="40px"
android:scaleType="fitCenter" />
<TextView
android:id="@+id/tv_app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/x10"
android:textColor="@color/white"
android:textSize="40px" />
</LinearLayout>
<androidx.cardview.widget.CardView
android:layout_width="@dimen/x340"
android:layout_height="@dimen/y191"
android:layout_below="@+id/ll_header"
app:cardCornerRadius="24px"
app:cardElevation="0dp">
<ImageView
android:id="@+id/iv_task_snap_shot"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop" />
</androidx.cardview.widget.CardView>
</RelativeLayout>
For example

public void onTaskClick(TaskBean taskBean) {
if (taskBean.getId() >= 0) {
((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)).moveTaskToFront(taskBean.getId(), ActivityManager.MOVE_TASK_WITH_HOME);
} else {
startActivity(taskBean.getBaseIntent());
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!