android手机返回桌面后,点击app图标,app重启

本文探讨了解决App视频聊天Activity在特定情况下被系统回收的问题。通过设置alwaysRetainTaskState属性及使用moveTaskToBack方法,确保了即使在内存紧张时也能保持Activity不被销毁,提升了用户体验。

开发过程中,测试发现app在视频时,华为手机点击home键返回到桌面,再点击app图标,视频页面被干掉了。

经过测试,发现点击app图标后是重新启动了app,也试了其他的app有的也是干掉了Main以上的Activity,而微信没有

网上查了之后,有人说是内存不够,按照此思路清理了手机内存,确实手机后台开了很多app,经过测试,app没有重启,视频Activity仍在

在内存吃紧的情况下,为何我们开发的app,视频聊天Activity被干掉,为何微信的没有干掉呢?



继续查资料

找到一篇文章:http://blog.sina.com.cn/s/blog_5de73d0b0102vpai.html

比如:打开QQ客户端,进入到好友聊天界面,然后按HOME返回桌面
这时候有两种情况:
1、如果你在最近任务中切换会QQ客户端,那么还是显示好友聊天界面
2、如果点击QQ客户端图标打开,依然显示好友聊天界面
 
默认情况下是不可能实现上面的功能的。
但是,使用android:alwaysRetainTaskState="true",可以实现我们的需求。
 
我们要做的是:
在Androidmanifest.xml文件中,给根Activity加上android:alwaysRetainTaskState="true",就可以了。
根Activity就是应用默认启动的Activity,一般是欢迎页面SplashActivity或主页面MainActivity。

简单解释一下:
android:alwaysRetainTaskState顾名思义就是【总是保留任务栈状态】
 
Task指的是任务栈,是用于记录Activity打开顺序、保存状态等。



最近发现了一个方法,
它就是Activity.moveTaskToBack(boolean),
这个方法可以把整个任务栈放到后台运行,相当于PC窗口的最小化一样!十分强大!
 
一般来说,为了保证应用在后台运行,提高再次打开的速度,一般都不会直接finish(),
(可以参考一下QQ、微信、微博这些长驻留应用)
为了实现这个功能,比较通用的做法是在用户按下返回键的时候,调用如下代码实现:
 
 @Override
 public void onBackPressed()
 {
    //按返回键返回桌面
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
 }
 
这个方法虽然可以实现我们所需功能,
但是,如果有用户安装了多个桌面应用的时候,可能会提出对话框,要求用户选择一个桌面运行。
 
但是,如果把代码改成这样:
 @Override
 public void onBackPressed()
 {
    //按返回键返回桌面
    moveTaskToBack(true);
 }
 
就不会出现上述问题了!!
 
其它,QQ也是用这种方式实现的。
有一点细微的差别。前者会返回桌面的默认页面,后者返回桌面上次停留的页面。



<think>我们面临的需求是:在AndroidLauncher3源码中隐藏或移除特定应用桌面图标。根据引用[2]我们知道,图标的操作(包括长按)通常是在BubbleTextView或Icon类中实现的。因此,我们可以考虑在图标加载时过滤掉特定应用。另外,引用[1]提到Launcher3负责显示应用程序列表,因此我们需要在显示应用图标的地方进行过滤。引用[4]提到了DeviceProfile类,但它主要是管理设备布局信息,与我们的需求关联不大。思路:1.找到Launcher3加载应用图标的地方。2.在加载图标时,判断应用是否属于需要隐藏的应用,如果是,则不显示。通常,Launcher3会从系统包管理器获取已安装应用列表,然后为每个应用创建一个快捷方式(图标)并显示在桌面上。因此,我们可以修改获取应用列表后的处理逻辑,过滤掉特定包名的应用。步骤:1.在Launcher3源码中,负责加载应用图标的代码可能在src/com/android/launcher3/model/LoadAppTask.java(或类似名称,不同版本可能位置不同)中,具体是在加载所有应用的地方。2.我们可以创建一个需要隐藏的包名列表(例如:包含需要隐藏的应用包名的数组或列表)。3.在遍历应用列表时,如果应用的包名在需要隐藏的包名列表中,则跳过该应用。具体实现:例如,在LoadAppTask.java中,有一个方法可能是`loadAllApps()`,它会将应用添加到AllAppsList中。我们可以在这里进行过滤。但是注意:桌面上的图标(Workspace上的图标)和抽屉里的图标(AllApps)是两个不同的地方。如果只是要隐藏桌面上的图标,则可能需要修改其他地方。根据需求,可能是要隐藏桌面上的图标(包括Workspace和Hotseat等),也可能是隐藏应用抽屉里的图标?这里我们假设是要在桌面(包括Workspace)和应用抽屉里都隐藏。实际上,Launcher3在加载应用时,会将应用添加到AllAppsList(应用抽屉列表)。然后,桌面图标是从这个AllAppsList中获取的,或者是从数据库中恢复的已添加快捷方式。如果只是隐藏应用抽屉中的应用,那么只需要在加载应用抽屉列表时过滤掉这些应用。但如果要确保桌面上也没有这些应用图标,则还需要在数据库加载时过滤,并且防止用户再次从应用抽屉中添加。考虑到需求是“移除特定应用桌面图标”,这里我们理解为:在Launcher中完全不显示该应用图标(无论是桌面上还是抽屉里)。因此,我们需要做两处修改:1.在加载所有应用列表(应用抽屉)时,过滤掉特定应用。2.在加载桌面时,检查每个快捷方式(包括应用快捷方式和文件夹中的快捷方式)是否属于被隐藏的应用,如果是,则跳过添加。由于Launcher3的复杂性,我们需要谨慎处理。具体代码修改建议:1.在加载应用列表到应用抽屉的地方(通常在LoadAppTask中)进行过滤:假设在`LoadAppTask::execute`方法中,有一段代码是:ArrayList<AppInfo>apps=loadAllApps();//加载所有应用我们可以修改这个方法,让它过滤掉特定包名。2.同时,在加载桌面布局时(从数据库恢复快捷方式),也需要过滤。这部分代码可能在src/com/android/launcher3/model/LoaderTask.java中。然而,为了减少重复代码,我们可以创建一个工具类,提供一个方法来判断一个应用是否应该被隐藏。步骤:1.创建一个包含需要隐藏的包名的列表(可以硬编码,或者将来通过某种方式配置)。例如,我们定义一个数组:privatestaticfinalString[]HIDDEN_PACKAGES={"com.example.app1","com.example.app2"};2.在需要的地方使用这个列表进行过滤。具体修改:修改1:在加载所有应用列表时过滤在LoadAppTask.java中(或者其他加载应用的地方),找到将应用添加到列表的循环,加入判断:for(ApplicationInfoapp:apps){if(isHidden(app.componentName.getPackageName())){continue;}//否则添加到列表}修改2:在从数据库加载桌面图标时过滤在LoaderTask.java中(或类似的任务类),当加载桌面上的快捷方式时,我们需要判断每个快捷方式是否是被隐藏的应用。//在加载快捷方式的时候for(iteminitems){//items是从数据库读取的快捷方式if(item.itemType==ITEM_TYPE_APPLICATION){StringpackageName=item.intent.getComponent().getPackageName();if(isHidden(packageName)){continue;//跳过隐藏的应用}}//添加到桌面}修改3:防止用户从应用抽屉中添加被隐藏的应用桌面由于应用抽屉里已经没有了被隐藏的应用,所以用户无法添加它们。3.定义isHidden方法,可以在一个公共的工具类里,或者直接在需要的地方写一个帮助方法。例如,在LauncherModel中定义一个静态方法:publicstaticbooleanisHidden(StringpackageName){for(Stringhidden:HIDDEN_PACKAGES){if(hidden.equals(packageName)){returntrue;}}returnfalse;}4.注意:在Launcher3中,AllAppsList更新时也会触发桌面图标的添加(例如安装新应用时),所以我们也需要确保在动态更新时也过滤这些应用。5.另外,在Launcher3中,可能有一些系统应用不能被隐藏(比如设置),但我们这里只针对特定包名,所以只要包名匹配就隐藏。但是,以上方法需要修改多个文件,而且需要仔细确认加载流程。在实际修改时,需要根据具体的Launcher3版本代码来定位。另外,引用[3]中提到了Launcher.xml布局文件,但我们的修改是逻辑上的,和布局无关。由于不同版本的Android源码中Launcher3的结构可能不同,上述路径仅供参考,实际修改时需要根据源码进行调整。如果只想隐藏桌面上的图标(包括已添加的快捷方式)而不影响应用抽屉,则只需修改加载桌面图标的部分(修改2)。如果只想隐藏应用抽屉的而不影响桌面,则只需修改修改1。但是需求是隐藏或移除特定应用桌面图标,通常是指桌面上(可能还有应用抽屉)的图标。因此,我们选择在加载应用抽屉和加载桌面图标时都进行过滤,以实现完全隐藏。相关问题:1.如何在Launcher3中动态隐藏应用图标(例如通过设置菜单来控制)?2.除了修改源码,还有没有其他方法可以隐藏特定应用桌面图标?3.如果隐藏了某个应用,如何恢复显示?注意:上述修改需要重新编译Launcher3并刷入设备。</think> 要在 Android Launcher3 源码中隐藏特定应用桌面图标,可以通过以下步骤实现。整个过程需要修改三个核心模块: ### 📌 实现步骤 --- #### 1. **创建应用过滤工具类** 在代码中硬编码需要隐藏的应用包名列表: ```java // 文件路径: src/com/android/launcher3/util/AppFilter.java public class AppFilter { private static final String[] HIDDEN_APPS = { "com.example.app1", // 待隐藏应用1的包名 "com.example.app2" // 待隐藏应用2的包名 }; public static boolean shouldHideApp(String packageName) { for (String hiddenApp : HIDDEN_APPS) { if (hiddenApp.equals(packageName)) { return true; } } return false; } } ``` #### 2. **过滤应用抽屉图标** 在加载应用列表的代码中加入过滤逻辑: ```java // 文件路径: src/com/android/launcher3/model/LoadAppTask.java public void run() { ... List<ApplicationInfo> apps = PackageManagerCompat.getInstalledApplications(); for (ApplicationInfo app : apps) { // 增加过滤逻辑 if (AppFilter.shouldHideApp(app.componentName.getPackageName())) { continue; // 跳过隐藏应用 } allApps.add(app); } ... } ``` #### 3. **过滤工作区图标** 在桌面加载逻辑中增加对现有图标的过滤: ```java // 文件路径: src/com/android/launcher3/model/LoaderTask.java private void loadWorkspace() { ... for (ItemInfo item : itemsFromDatabase) { // 处理应用图标 if (item.itemType == Favorites.ITEM_TYPE_APPLICATION) { String pkg = item.getIntent().getComponent().getPackageName(); if (AppFilter.shouldHideApp(pkg)) { continue; // 跳过隐藏应用 } } // 添加到工作区 workspaceItems.add(item); } ... } ``` #### 4. **更新配置文件(可选)** 如果使用 XML 布局文件,确保布局 ID 正确: ```xml <!-- 文件路径: res/layout/launcher.xml --> <include android:id="@+id/hotseat" layout="@layout/hotseat" /> <!-- 确保ID正确[^3] --> ``` ### 🔍 关键原理 - **应用抽屉过滤**:在`LoadAppTask`加载应用列表时直接过滤特定包名[^1] - **工作区清理**:在`LoaderTask`读取数据库时跳过隐藏应用的快捷方式 - **动态生效**:修改后需重启 Launcher(通过`adb shell am force-stop com.android.launcher3`) ### ⚠️ 注意事项 1. **兼容性**:Launcher3 的类路径可能因 Android 版本变化(如 AOSP 10 和 13 路径不同) 2. **系统签名**:修改后的 Launcher 需使用系统签名编译才能在设备生效 3. **多用户支持**:若需支持多用户,应通过`UserHandle`获取包名前缀如`user_10_package.name` ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值