androidservice运行
‘壹’ 安卓系统怎么才能让软件后台运行
可以使用Service运行,sevice就是在后台运行的进程。
Android中,当Service被kill后,如果重启需要使用BroadcastReceiver来实现,即广播接收者,例如利用BroadcastReceiver注册网络广播或者开关机广播,当接收到广播后直接启动service,这样就可以保证service被kill后,自动启动。
实现代码:
1.在配置文件AndroidManifest.xml中向系统注册BroadcastReceiver
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
2.需要添加相应权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
3.在Receiver中就可以添加开机,或者网络状态改变后需要进行的操作
public class BootCompletedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
4.执行操作,Intent intent = new Intent(context,Service.class); context.startService(intent); 这样即可开机,或者网络状态改变后启动Service了。
‘贰’ android守护进程
Android中应该使用Service而不应该使用线程,Android中有提供后台运行的组件,叫Service。
servie是系统的组件,它由系统进程托管(servicemanager);它们之间的通信类似于client和server,是一种轻量级的ipc通信,这种通信的载体是binder,它是在linux层交换信息的一种ipc。而thread是由本应用程序托管。
Thread:Thread是程序执行的最小单元,它是分配CPU的基本单位。可以用Thread来执行一些异步的操作。
Service:Service是android的一种机制,当它运行的时候如果是Local Service,那么对应的Service是运行在主进程的main线程上的。如:onCreate,onStart这些函数在被系统调用的时候都是在主进程的main线程上运行的。如果是RemoteService,那么对应的Service则是运行在独立进程的main线程上。
关于用户线程和守护线程:
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)
Daemon的作用是为其他线程的运行提供便利服务,比如垃圾回收线程就是一个很称职的守护者。User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,虚拟机也就退出了。 因为没有了被守护者,Daemon也就没有工作可做了,也就没有继续运行程序的必要了。
‘叁’ 手机刚开机就显示 Android Services已停止运行 是什么意思
手机刚开机就出现进程 Android Services已停止运行有如下原因:
1.是自己刷机后没有wipe或手机在线ota升级后没有自动双清,导致联系人缓存混乱,所以报错。
2.是用了某些同步工具,同步联系人,导致的错乱问题。
3.SIM卡上存储的信息问题。
4.比如删除了系统必备apk,或者是替换了不同版本的apk,导致的错误。
建议按照以下方法操作:
1.手机中是否安装手机安全卫士软件或者一些第三方软件程序,如果有请卸载尝试。
2.建议把机器恢复出厂设置,操作如下:设置-重置/隐私权/私人-恢复出厂
3.建议固件升级尝试。(设置-关于设备-系统更新)
若通过以上方法问题依然存在,带好购机发票、包修卡和机器送到服务中心,由工程师检查机器并处理。
‘肆’ Android应用组件 —— Service
官方原文: 地址
本文摘录自官方原文,方便自己观看。
service 是一个可以在后台长时间运行的操作而不提供用户界面的应用组件。服务可以由其他应用组件启动,而且即使用户切换到其他应用程序,服务仍将在后台继续运行。此外,组件可以绑定到服务,以与之进行交互,甚至执行进程间的通信(IPC)
服务基本分为两种形式:
启动
绑定
上述虽然分开概括这两种服务,但是服务可以同时以这两种方式运行,也就是说,他既可以是启动服务(以无限期运行),也允许绑定。问题在于是否实现了一组回调方法: onStartCommand() (允许组件启动服务)和 onBing() (允许绑定服务)。
无论应用是出于启动状态还是绑定状态,亦或处于启动并且绑定状态,任何应用组件均可以像使用Activity那么调用Itent来使用服务(即使此服务来自另一应用)。 不过,您可以通过清单文件将服务声明为私有服务,并阻止其他应用访问。 使用清单文件声明服务部分将对此做更详尽的阐述。
注意:
服务在其托管进程的主线程中运行,它既不创建自己的线程,也不在单独的进程中运行(除非另行指定)。这意味着,如果服务将执行任何CPU密集型工作或者阻止性操作(我理解为耗时操作,例如 MP3 播放或联网),则应在服务内创建新线程来完成这项工作。通过使用单独的线程,可以降低发生“应用无响应”(ANR) 错误的风险,而应用的主线程仍可继续专注于运行用户与 Activity 之间的交互。
要创建服务,您必须创建 Service 的子类(或使用它的一个现有子类)。在实现中,您需要重写一些回调方法,以处理服务生命周期的某些关键方面并提供一种机制将组件绑定到服务(如适用)。 应重写的最重要的回调方法包括:
onStartCommand()
onBind()
onCreate()
onDestroy()
如果组件通过调用 startService() 启动服务(这会导致对 onStartCommand() 的调用),则服务将一直运行,直到服务使用 stopSelf() 自行停止运行,或由其他组件通过调用 stopService() 停止它为止。
如果组件是通过调用 bindService() 来创建服务(且未调用 onStartCommand() ,则服务只会在该组件与其绑定时运行。一旦该服务与所有客户端之间的绑定全部取消,系统便会销毁它。
如同 Activity(以及其他组件)一样,您必须在应用的清单文件中声明所有服务。
要声明服务,请添加 <service> 元素作为 <application> 元素的子元素。例如:
为了确保应用的安全性, 请始终使用显式 Intent 启动或绑定 Service,且不要为服务声明 Intent 过滤器。 启动哪个服务存在一定的不确定性,而如果对这种不确定性的考量非常有必要,则可为服务提供 Intent 过滤器并从 Intent 中排除相应的组件名称,但随后必须使用 setPackage() 方法设置 Intent 的软件包,这样可以充分消除目标服务的不确定性。
此外,还可以通过添加 android:exported 属性并将其设置为 "false" ,确保服务仅适用于您的应用。这可以有效阻止其他应用启动您的服务,即便在使用显式 Intent 时也如此
Service
IntentService
简单地说,服务是一种即使用户未与应用交互也可在后台运行的组件。 因此,您应仅在必要时才创建服务。
如需在主线程外部执行工作,不过只是在用户正在与应用交互时才有此需要,则应创建新线程而非服务。 例如,如果您只是想在 Activity 运行的同时播放一些音乐,则可在 onCreate() 中创建线程,在 onStart() 中启动线程,然后在 onStop() 中停止线程。您还可以考虑使用 AsyncTask 或 HandlerThread,而非传统的 Thread 类。
前台服务被认为是用户主动意识到的一种服务,因此在内存不足时,系统也不会考虑将其终止。 前台服务必须为状态栏提供通知,放在“正在进行”标题下方,这意味着除非服务停止或从前台移除,否则不能清除通知。
要请求让服务运行于前台,请调用 startForeground() 。此方法采用两个参数:唯一标识通知的整型数和状态栏的 Notification 。例如:
注意 :提供给 startForeground() 的整型 ID 不得为 0。
要从前台移除服务,请调用 stopForeground() 。此方法采用一个布尔值,指示是否也移除状态栏通知。 此方法不会停止服务。 但是,如果您在服务正在前台运行时将其停止,则通知也会被移除。
与 Activity 类似,服务也拥有生命周期回调方法,您可以实现这些方法来监控服务状态的变化并适时执行工作。 以下框架服务展示了每种生命周期方法:
注 :与 Activity 生命周期回调方法不同,您 不 需要调用这些回调方法的超类实现。
注 :尽管启动服务是通过调用 stopSelf() 或 stopService() 来停止,但是该服务并无相应的回调(没有 onStop() 回调)。因此,除非服务绑定到客户端,否则在服务停止时,系统会将其销毁 — onDestroy() 是接收到的唯一回调。
‘伍’ android 如何让service不在主线程中运行
调用者与服务绑定在一起就可以让service不在主线程中运行。安卓是一种基于Linux内核的自由及开放源代码的操作系统。
主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。
系统信息
Android一词的本义指机器人,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。Android一词最早出现于法国作家利尔亚当在1886年发表的科幻小说未来夏娃中。
他将外表像人的机器起名为Android。Android的Logo是由Ascender公司设计的,诞生于2010年,其设计灵感源于男女厕所门上的图形符号,于是布洛克绘制了一个简单的机器人,它的躯干就像锡罐的形状,头上还有两根天线,Android小机器人便诞生了。
其中的文字使用了Ascender公司专门制作的称之为Droid的字体。Android是一个全身绿色的机器人,绿色也是Android的标志。