manifest 内android:persistent属性带来的问题

本文探讨了在Android 4.2系统下使用persistent属性导致ImageView轮播卡顿的问题,并通过实验证明移除该属性可以有效提升性能。

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

先前在android4.4上的机器因为进程总是被系统杀掉,所以在应用的manifest中增加了android:persistent这个属性问题true.

可是当应用移植到其他4.2的机器上时,应用有一个功能是轮播图片,但是发现在轮播的过程中很卡,经过代码分析以及多次试验得出在轮播的时候,imageview的绘制耗时很严重。

亲测,在去掉这个属性之后,轮播不在卡了。但是android:persistent是表示本进程是系统常驻,为什么会影响到imageview的绘制呢?暂时还没有找到相关答案,不过此属性还是慎用。

<think>我们正在讨论的是Android清单文件(AndroidManifest.xml)中的一个属性设置。在<application>标签中,android:persistent="true"表示该应用程序是持久性的。这意味着应用程序将始终运行,系统不会在内存不足时终止它。通常,只有系统应用才会设置此属性,因为普通应用很少需要这种特性。在Java代码中,我们通常不会直接设置这个属性,因为它是在清单文件中声明的。但是,我们可以讨论这个属性的含义以及为什么使用它。原因和解释:1.持久性应用(persistentapplication)会在系统启动时自动启动,并且会一直运行,即使系统资源紧张也不会被杀死。2.这个属性通常被用于系统核心应用,比如HomeLauncher(主屏幕)、电话等,这些应用需要始终保持运行以确保系统的核心功能可用。3.在普通应用中使用此属性是不被推荐的,因为系统可能会拒绝非系统应用使用此属性,即使设置了也可能无效。而且,如果所有应用都设置为持久应用,系统内存管理将变得困难。在Java代码中,我们无法通过编程方式设置这个属性,因为它必须在AndroidManifest.xml中声明。例如:```xml<manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.example.myapp"><applicationandroid:persistent="true"...>...</application></manifest>```需要注意的是,这个属性只能被系统应用使用,因为系统应用通常位于/system/app或/system/priv-app目录下,并且使用系统签名。普通应用即使设置了这个属性,系统也会忽略。相关问题:1.在Android中,如何创建一个系统应用?2.除了设置android:persistent="true",还有哪些方法可以让应用在系统启动时自动启动?3.为什么普通应用不应该设置为持久应用?4.系统如何管理持久应用的生命周期?现在,请按照要求回答用户的问题,并在最后提出四个相关问题。</think>在 Android 开发中,`<application android:persistent="true">` 是 AndroidManifest.xml 文件中的一个声明,用于标记应用为**持久性应用**。以下是详细解释和注意事项: ### 作用和特点 1. **系统级特权** - 仅限**系统级应用**使用(预装在 `/system/app` 或 `/system/priv-app` 目录) - 普通应用设置此属性无效,系统会忽略 2. **生命周期行为** - 应用在设备启动时**自动启动**(无需用户操作) - 系统**不会在内存不足时终止**该进程 - 即使被手动停止,系统也会自动重启(如崩溃后) 3. **典型使用场景** ```xml <!-- 系统核心组件示例 --> <application android:name=".SystemCoreApp" android:persistent="true" android:label="System Core Service"> <!-- 如电话服务、系统UI等 --> </application> ``` ### 关键注意事项 1. **权限限制** - 需要系统签名 + 预装在系统分区 - 普通应用添加此属性会触发安装错误: ``` INSTALL_FAILED_SHARED_USER_INCOMPATIBLE ``` 2. **资源消耗风险** - 持久化应用占用常驻内存 - 错误使用可能导致系统卡顿/耗电增加 3. **替代方案(普通应用)** 如需实现类似功能,应使用: ```java // 使用前台服务 + 部分唤醒锁 public class MyService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { startForeground(NOTIFICATION_ID, createNotification()); acquireWakeLock(); // PARTIAL_WAKE_LOCK return START_STICKY; } } ``` ### 根本原理 Android 系统在启动时会扫描所有应用的清单文件。当检测到 `persistent="true"` 时: 1. ActivityManagerService 将应用加入持久化列表 2. 进程优先级被设为 `PERSISTENT_PROC_ADJ` (-800) 3. 内存回收策略跳过该进程 ### 代码验证方法 检查应用是否成功持久化: ```java // 在系统级应用中检查进程状态 ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); for (ActivityManager.RunningAppProcessInfo proc : am.getRunningAppProcesses()) { if (proc.processName.equals("your.package.name")) { Log.d("PERSISTENT", "重要度级别: " + proc.importance); // 持久化进程返回 IMPORTANCE_PERSISTENT (-800) } } ``` ### 常见错误 1. **普通应用使用** → 安装失败 2. **未声明组件** → 持久化失效(需至少包含一个四大组件) 3. **过度使用** → 导致系统内存不足
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值