Android AndroidManifest.xml相关flag详细说明

本文详细介绍了Android中Activity的几个关键属性:stateNotNeeded、clearTaskOnLaunch和excludeFromRecents的功能及应用场景。stateNotNeeded属性可以避免不必要的状态保存,clearTaskOnLaunch用于清理任务栈中的非根Activity,而excludeFromRecents则控制Activity是否出现在最近任务列表中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android:stateNotNeeded:  默认为false,若设为true,则当Activity重新启动时不会调用onSaveInstanceState()方法,同样,onCreate()方法中的Bundle参数将会用null值传进去,也就是说,Activity每次启动都跟第一次启动一样。这样,在某种特殊场合下,由于用户按了Home键,该属性设置为true时,可以保证不用保存原先的状态引用,节省了空间资源,从而可以让Activity不会像默认设置那样Crash掉。

android:clearTaskOnLaunch: 用来标记是否从task清除除根Activity之外的所有的Activity,“true”表示清除,“false”表示不清除,默认为“false”。同样,这个属性也只对根Activity起作用,其他的Activity都会被忽略。如果设置了这个属性为“true”,每次用户重新启动这个应用时,都只会看到根Activity,task中的其他Activity都会被清除出栈。如果我们的应用中引用到了其他应用的Activity,这些Activity设置了allowTaskReparenting属性为“true”,则它们会被重新宿主到有共同affinity的task中。android:clearTaskOnLaunch=true 只放在一个activity Task 的root activity有效,在其他activity设置就无效。

android:excludeFromRecents控制在不在recent列表中显示。true时不显示;false显示,默认。运行activity后,不会显示在recent列表中。

要动态修改AndroidManifest.xml中service的属性,需要使用Android的PackageManager和PackageInfo类。 首先,获取要修改的Service的PackageInfo对象: ```java PackageManager pm = getPackageManager(); PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), PackageManager.GET_SERVICES); ``` 然后,找到要修改的Service: ```java ServiceInfo[] services = packageInfo.services; ServiceInfo targetService = null; for (ServiceInfo serviceInfo : services) { if (serviceInfo.name.equals("com.example.MyService")) { targetService = serviceInfo; break; } } ``` 接下来,使用反射机制获取ServiceInfo类中的flags属性: ```java Field flagsField = ServiceInfo.class.getDeclaredField("flags"); flagsField.setAccessible(true); int flags = flagsField.getInt(targetService); ``` 修改flags属性: ```java flags |= ServiceInfo.FLAG_STOP_WITH_TASK; // 设置 FLAG_STOP_WITH_TASK 标记 ``` 最后,使用PackageParser类重新解析AndroidManifest.xml,并将修改后的ServiceInfo对象写回到AndroidManifest.xml中: ```java File packageFile = new File(getPackageResourcePath()); PackageParser packageParser = new PackageParser(); PackageParser.Package pkg = packageParser.parsePackage(packageFile, 0); pkg.applicationInfo.flags |= ApplicationInfo.FLAG_HAS_CODE; pkg.services[0] = targetService; PackageUserState state = new PackageUserState(); PackageInstaller.Session params = createSession(); PackageInstaller packageInstaller = pm.getPackageInstaller(); int sessionId = packageInstaller.createSession(params); PackageInstaller.Session session = packageInstaller.openSession(sessionId); session.fsync(new FileOutputStream(packageFile)); session.close(); ``` 注意:该方法需要在应用程序的主进程中执行,并且需要动态申请WRITE_EXTERNAL_STORAGE权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值