Ⅰ android:当Activity和Service 都被销毁后,如何控制其中生成的线程
1.首先
android
一个程序中
的activity
都是一个线程,service和activity也是一个线程
2.在activity
中启动一个子线程,当前activity
finish
destroy掉
子线也会运行的。
3.在service里的线程
与activity很类似
service即使停止了
线程也在运行(要先停止服务
再把最近使用的进程杀掉
线程会停止
,如果直接杀掉进程
android会再次自动启动这个service的
此时即使再停止service服务
线程也会一直运行了除非关机)
activity
finish
子线程依旧可以运行,即使程序退出了子线程也在运行
(除非在任务管理器里
把最近使用的进程杀掉)
4.JVM有很好的管理机制,系统最后会自动释放回收。作为手动回收来说,你可以调用interrupt
Ⅱ Android 服务的限制
Google官网将Android服务分为了三种,前台服务,后台服务和绑定服务:
前台服务执行一些用户能注意到的操作。例如,音频应用会使用前台服务来播放音频曲目。前台服务必须显示 通知 。即使用户停止与应用的交互,前台服务仍会继续运行。
后台服务执行用户不会直接注意到的操作。例如,如果应用使用某个服务来压缩其存储空间,则此服务通常是后台服务。
当应用组件通过调用 bindService() 绑定到服务时,服务即处于 绑定 状态。绑定服务会提供客户端-服务器接口,以便组件与服务进行交互、发送请求、接收结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。仅当与另一个应用组件绑定时,绑定服务才会运行。多个组件可同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。
我个人理解服务可以分为两种, 前台 和 后台 ,而 绑定 应该是被当作一种状态,因为 前台服务 和 后台服务 都可以进行绑定。
基于这个理解,我们将限制分成了前台和后台两个部分:
从 Android 5.0(API 级别 21)开始,如果使用隐式 Intent 调用 bindService() ,则系统会抛出异常。为确保应用的安全性,在启动 Service 时,请始终使用显式 Intent,且不要为服务声明 Intent 过滤器。
在后台中运行的 Service 会消耗设备资源,这可能会降低用户体验。 为了缓解这一问题,系统对这些 Service 施加了一些限制。
处于前台时,应用可以自由创建和运行前台与后台 Service。
Android 8.0 开始:系统不允许后台应用创建后台 Service。否则该函数将引发一个 IllegalStateException。
Android 8.0 开始:进入后台时,在一个持续数分钟的时间窗内,应用仍可以创建和使用 Service。 在该时间窗结束后,应用将被视为处于 空闲 状态。 此时,系统将停止应用的后台 Service,就像应用已经调用 Service 的 Service.stopSelf() 方法一样。
为了解除这种限制,可以使用 JobScheler 作业替换后台 Service。
在 Android 8.0 之前,创建前台 Service 的方式通常是先创建一个后台 Service,然后将该 Service 推到前台。
而在Android 8.0 之后,系统不允许后台应用创建后台 Service。
解决方案:调用 startForegroundService() ,以在前台启动新 Service。
在系统创建 Service 后,应用有五秒的时间来调用该 Service 的 startForeground() 方法以显示新 Service 的用户可见通知。 如果应用在此时间限制内 未 调用 startForeground() ,则系统将停止此 Service 并声明此应用为 ANR 。
前台服务必须显示优先级为 PRIORITY_LOW 或更高的 状态栏通知 ,这有助于确保用户知道应用正在执行的任务。如果某操作不是特别重要,因而您希望使用最低优先级通知,则可能不适合使用服务;相反,您可以考虑使用 计划作业 。
在 Android 9 (API 28)之后,使用前台服务必须申请 FOREGROUND_SERVICE 权限,否则会报 SecurityException 。 这是普通权限,因此,系统会自动为请求权限的应用授予此权限。
每个运行服务的应用都会给系统带来额外负担,从而消耗系统资源。如果应用尝试使用低优先级通知隐藏其服务,则可能会降低用户正在主动交互的应用的性能。因此,如果某个应用尝试运行拥有最低优先级通知的服务,则系统会在抽屉式通知栏的底部调用出该应用的行为。
以 Android 12 为目标平台的应用在后台运行时无法再启动 前台服务 。
在 Android 11 及以后,系统对前台服务何时可以访问设备的位置、摄像头或麦克风进行了限制。
如果您的应用以 Android 11 或更高版本为目标平台,且在前台服务中访问摄像头或麦克风,则必须添加 前台服务类型 camera 和 microphone 。
如果你的应用 在后台运行时启动了某项前台服务 :
如果某服务的功能(位置、麦克风 和 相机)受到了限制,则Logcat中会打印如下语句:
Ⅲ Android基础:Service —— 默默为你服务
Service有两种启动方式,分别为 context.startService() 和 context.bindService() 。这里要提到Service的生命周期,两种不同的启动方式有不同的生命周期:
Tips:
首先创建自己的Service类,重写其生命周期,并在mainfest.xml中进行注册。
必须注册Service,不然不会调用。简单注册:
补充下Service在manifest中的属性以及作用:
接下来,我们就可以用下面的两个方法来启动和停止服务。
首先在我们的Activity中创建Service连接对象,重写连接和断开的方法。创建自定义的Binder对象,在 onServiceConnected() 中赋值然后可以调用自定义Binder中的方法。使用下方的bind()方法来绑定服务,使用 unBind() 来解绑服务。
这里会用到Service的 onBind() 和 onUnbind() 的生命周期,我们在TestService中重写之。这里要注意的是,使用bindService()方法启动的Service,不会调用 onStartCommand() 的生命周期。此外,创建自定义Binder类和对象。
这样,当我们使用Activity中的bind()方法来绑定服务,会自动启动服务,而我们又重写了 onServiceConnected() 方法并使用myBinder来调用方法。这样我们就可以用它来Activity和Service来进行通信。
特别Tips:
如果先使用 startService() 来开启服务和 bindService() 来绑定服务,当使用 unbindService() 解绑时,Service并不会被销毁。而是使用 stopService() 才能销毁服务。
前台服务和后台服务的区别:
在Service中进行操作,将服务类型以前台的方式运行显示在通知栏。
运行效果:
暂时引用吧,有空再实现一个:
参考资料:
Ⅳ 分享:Android入门开发之销毁activity
使用:
销毁、关闭页面activity
如果打开下个页面的同时销毁了本页面,在下个页面无法返回本页面,每次打开APP应用就会先显示一张APP的介绍图、或者LOGO页面,延时几秒进入应用,进入后无法再返回LOGO页面,就是将LOGO页面进行了摧毁finish();
方法:
finish();销毁activity
activity名.finish();销毁指定activity,等同于this
this.finish();销毁本页面activity
activity名.instance.finish();在本页面销毁其他页面的activity
用法1:用返回键,点击返回键触发onTouchEvent
1.@Override
2.public boolean onTouchEvent(MotionEvent event){
3.finish();
4.return true;
5.}
用法2:销毁其他页面
1. //在需要销毁的页面:
2. //定义一个静态全局变量instance
3. public static MainActivity instance =
null;
4. //在onCreate里
5. instance = this;
6.
7. //在执行销毁的页面:
8. MainActivity .instance.finish();
9.
10. //MainActivity就被销毁了
销毁不用activity可以节约内存的占用!APP在线自动化测试工具: www.ineice.com
Ⅳ android 里面如何销毁一个Service 在网上找了很多答案System.exit(0);ActivityManager之类的都没用!
确实有stopSelf()方法,不过需要在你的service类里面调用。
在外面可以使用Context.StopService()方法
可以看看Google文档http://developer.android.com/reference/android/app/Service.html
final void stopSelf()Stop the service, if it was previously started.
或者再网络一下,多试试,肯定能搞定的
Ⅵ android中启动service的activity销毁了,这时怎么关闭service
可以在销毁Activity时 通知 service 销毁。
在Activity :
onDestory(){
//
发送 广播 通知 serivice 关闭。
sendBroadCast();
}