一、项目中遇到这样一个问题:
音乐播放程序有Activity、Service构成,音乐播放在Service中完成。
现象1:在后台播放在线音乐时,前台程序快速滑动Listview,此时前台程序cpu占有率可达60%-80%,后台音乐播放程序cpu占有率1%-3%,但出现严重卡顿现象;
现象2:音乐播放程序在前台,在Service中播放在线音乐,在Activity中快速滑动Listview,此时音乐播放程序cpu占有率60%-80%,但播放没有卡顿现象;
上述现象是在Android 2.3版本上测试;
二、问题分析:
先看一下Android系统里面定义的进程优先级:
1.前台进程( FOREGROUND_APP)
2.可视进程(VISIBLE_APP )
3.次要服务进程(SECONDARY_SERVER )
4.后台进程 (HIDDEN_APP)
5.内容供应节点(CONTENT_PROVIDER)
6.空进程(EMPTY_APP)
Android系统会根据这个优先级分配资源,如:内存、cpu等,大家知道的应用程序在系统内存不足时呗系统kill掉就是根据这个优先级做的。
当音乐程序退到后台之后其进程优先级降低,在系统cpu资料不足时,会降低音乐程序的cpu占有率,此时会出现卡顿问题;
三、解决办法:
将不可见的进程(我程序中因为包含Service,因此处于3级)提高到可见进程(发通知到通知栏),即2级;
具体做法在Service的onCreate方法中调用improvePriority:
private void improvePriority() {
NotificationManager mNM = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 我们并不需要为 notification.flags 设置 FLAG_ONGOING_EVENT,因为
// 前台服务的 notification.flags 总是默认包含了那个标志位
Notification notification = new Notification(R.drawable.ic_launcher,
"Foreground Service Started.", System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, PlayMusicService.class), 0);
notification.setLatestEventInfo(this, "Foreground Service",
"Foreground Service Started.", contentIntent);
// 注意使用 startForeground ,id 为 0 将不会显示 notification
startForeground(1, notification);
}
注意在Service的onDestroy中调用:
stopForeground(true);
一般情况不需要显示通知图标,因此注意startForeground的第一个参数;
上述发通知的方法已过时,不建议使用,用下面方面,原理不变:
private void improvePriority() {
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, CenterService.class), 0);
Notification notification = new Notification.Builder(this)
.setContentTitle("Foreground Service")
.setContentText("Foreground Service Started.")
.setSmallIcon(R.drawable.ic_launcher).setLargeIcon(null)
.build();
notification.contentIntent = contentIntent;
startForeground(1, notification);
}
分享到:
相关推荐
总的来说,提高Service优先级的关键在于将Service设置为前台Service,通过`startForeground()`方法并提供相应的Notification。这不仅提高了Service的生存率,也增强了用户体验。同时,了解Service的不同使用模式以及...
总结来说,提高Android服务的优先级可以通过将服务置于前台或利用绑定服务来实现。然而,开发者必须谨慎对待,平衡服务的持续运行与设备性能和电池寿命,以提供最佳的用户体验。同时,了解和适配Android的电源管理...
【Android 进程保活】提升进程优先级 ( 使用前台 Service 提高应用进程优先级 | 启动相同 id 的第二个前台 Service 关闭通知 ) https://hanshuliang.blog.csdn.net/article/details/115531653 博客源码快照
总之,提高Android进程优先级主要是通过启动前台服务和优化程序设计来实现。在使用相机这样的功能时,确保进程不被销毁能有效避免崩溃和闪退,提高用户体验。同时,开发者应始终关注性能优化,合理管理内存,以适应...
【Android 进程保活】提升进程优先级 ( 使用前台 Service 提高应用进程优先级 | 启动相同 id 的第二个前台 Service 关闭通知 ) https://hanshuliang.blog.csdn.net/article/details/115531653 博客源码快照
在Android系统中,Service是一种非常重要的组件,它用于在后台执行长时间运行的操作,不与用户交互。"Android不死Service"这个概念,主要是针对Service在某些情况下可能会被系统或用户终止,而开发者希望Service能在...
在Android开发中,服务(Service)是一个至关重要的组件,它允许应用程序在后台执行长时间运行的操作,而无需与用户界面交互。本项目“Music Player Service”是针对Android平台设计的一个音乐播放器,它深入展示了...
Foreground Service会显示一个通知,告知用户服务正在运行,即使在用户离开应用或者设备屏幕关闭的情况下,服务也会保持运行状态,提高了服务的优先级,防止被系统因为内存不足而杀死。创建Foreground Service需要...
1. App保活策略:可以使用前台Service(显示通知)提高Service的优先级,降低被系统清理的风险。同时,利用JobScheduler、WorkManager等工具安排后台任务,确保在合适的时机执行。 2. 卡死崩溃检测:通过设置...
5. 另外,可以考虑使用前台Service,通过显示通知来提高Service的优先级。前台Service更难被系统杀死,因为它给用户提供了可见的反馈,表明应用正在后台执行重要任务。 6. 最后,合理使用`IntentService`,它是一个...
在Android系统中,进程是应用程序运行的基础,它们承载着应用的组件,如活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供者(Content Provider)。本教程“011_android之 进程及其...
Android系统为了优化资源管理,会根据应用程序组件的活跃程度将进程分为不同的级别,如前台进程、可见进程、服务进程、后台进程和空进程。当系统资源紧张时,低优先级的进程会被系统优先杀死,以释放资源。 `...
在Android系统中,Service是四大组件之一,它主要用于在后台执行长时间运行的操作,即使用户离开了应用程序,Service仍能持续运行。Service不提供用户界面,但可以与其他组件(如Activity)交互,例如通过Binder机制...
通过以上介绍,可以看出 Android Service 和 JNI 在 Android 开发中扮演着重要的角色,它们不仅能够扩展应用程序的功能,还能够在一定程度上优化性能和资源管理。开发者可以根据实际需求灵活运用这两种技术来构建高...
在Android开发中,有时开发者希望自己的应用程序能够在被第三方应用(例如安全软件)杀死后能够自动重启。这是因为Android系统为了节省资源,可能会根据进程的重要性来终止某些进程。对于开发者而言,确保自己的应用...
在Android平台上开发计算器应用是一项常见的任务,这有助于理解Android编程的基本原理和UI设计。下面将详细探讨这个"android 计算器...同时,这也是一个很好的实践项目,可以帮助开发者提高问题解决和代码调试的能力。
这会显示一个通知,提高Service的优先级,使其更不容易被系统杀死。 10. **Service的测试与调试** - 使用adb shell命令或Android Studio的Profiler工具监控Service的生命周期。 - 编写测试用例验证Service的行为...
- **AndroidService**:指的是运行在System Server进程中的系统服务,例如Activity Manager Service、Package Manager Service等。这些服务为整个系统提供了关键功能,是构建在Dalvik VM之上的组件,通过JNI调用底层...
在Android开发中,"双进程守护"是一种常见的技术策略,用于确保应用程序在后台持续运行,即使用户离开应用程序或系统...通过学习和实践这个示例,开发者可以掌握如何在Android应用中保持服务的稳定运行,提高用户体验。