android自启动service
Ⅰ Android 之 Service(一)启动,绑定服务
Service(服务)一个运行在后台执行长时间运行的操作组件,它不提供任何用户界面,作为与Activity同级的组件,它依旧是运行在主线程中。
其它组件可以启动一个Service,当这个Service启动之后便会在后台执行,这里需要注意,由于是在主线程中,所以我们需要另外开启一个线程来执行我们的耗时操作。
此外,一个组件还可以与一个Service进行绑定来实现组件之间的交互,甚至可以执行IPC(Inter-Process Communication)进程间通信。
Service可以在后台执行很多任务,比如处理网络事务,播放音乐,文件读写或者与一个内容提供者交互,等等。
本地服务(Local)
该服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外本地服务因为是在同一进程因此不需要IPC,也不需要AIDL。相应bindService会方便很多,当主进程被Kill后,服务便会终止。一般使用在音乐播放器播放等不需要常驻的服务。
远程服务(Remote Service)
该服务是独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。一般定义方式 android:process=":service" 由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务具有较高的灵活性。由于是独立的进程,会占用一定资源,并且使用AIDL进行IPC比较麻烦。一般用于系统的Service,这种Service是常驻的。
startService启动的服务
用于启动一个服务执行后台任务,不与组件进行通信,停止服务使用stopService。 当一个应用组件比如activity通过调用startService()来启动一个服务的时候,服务便处于启动状态。一旦启动,服务可以在后台无限期地运行下去,即使当启动它的组件已经销毁。通常情况下,一个启动的service执行一个单一的操作并且不会返回任何结果给调用者。
bindService启动的服务
用于启动的服务需要进行通信。停止服务使用unbindService。 当一个应用组件通过调用bindService()来与一个服务绑定时,服务便处于绑定状态。一个绑定的服务提供了一个客户端-服务器端接口来允许组件与服务进行交互,发送请求,得到结果甚至通过IPC进程间通信来完成操作。只有当其它组件与服务进行绑定时,服务才会处于绑定状态。多个组件可以同时与服务绑定,但是当他们全部都解除绑定时,服务就会销毁。
2.BindService:
如果一个Service在某个Activity中被调用bindService方法启动,不论bindService被调用几次,Service的 onCreate 方法只会执行一次,同时 onStartCommand 方法始终不会调用。当建立连接后,Service会一直运行,除非调用unbindService来接触绑定、断开连接或调用该Service的Context不存在了(如Activity被Finish——即通过bindService启动的Service的生命周期依附于启动它的Context),系统在这时会自动停止该Service。
3.StartService AND BindService:
当一个Service在被启动(startService 的同时又被绑定(bindService ),该Service将会一直在后台运行,并且不管调用几次, onCreate 方法始终只会调用一次, onStartCommand 的调用次数与startService 调用的次数一致(使用bindService 方法不会调用 onStartCommand )。同时,调用unBindService 将不会停止Service,必须调用stopService 或Service自身的stopSelf 来停止服务。
4.停止Service:
当一个服务被终止(stopService 、stopSelf 、unbindService )时, onDestory 方法将会被调用——所以我们需要在该方法中清除一些工作(依附该Service生命周期上的,比如:停止在Service中创建并运行的线程)。
1.创建服务
如果你才用的是 startService的方式那么 onBind方法可以忽略
2.注册服务
3.开启服务
start:
bind
绑定服务,一般涉及到组件或进程之间的通信,既然需要通信,那么我们肯定需要一个连接,这里ServiceConnection就是我们所需要的连接,通过Ibinder的传递,我们可以获取到Service的Ibinder对象,从而进行相关操作。
关于粘性服务,这里需要提到 Service的onStartCommand返回值
andorid:name
adroid:exported
android:enabled
android:label
android:process
android:icon
android:permission
关于服务,当我们在应用开发中,如果需要长时间的在后台运行,独立完成某一些事情的情况下,请使用Service!
此文综合: http://www.jianshu.com/p/1e49e93c3ec8 以及自己的一些问题看法,用作学习,回顾之用。
Service 前台服务
请参看 紫豪 http://www.jianshu.com/p/5505390503fa
Ⅱ android怎么实现开机自动启动Service或app
Android手机在启动的过程中会触发一个Standard Broadcast Action,名字叫android.intent.action.BOOT_COMPLETED。
在这里我们可以通过构建一个广播接收者来接收这个这个action
(1).
public class TextBroadcastReceiver extends BroadcastReceiver {
//重写onReceive方法
@Override
public void onReceive(Context context, Intent intent) {
//后边的XXX.class就是要启动的服务
Intent service = new Intent(context,XXXclass);
context.startService(service);
Log.v("TAG", "开机自动服务自动启动.....");
//启动应用,参数为需要自动启动的应用的包名
Intent intent = getPackageManager().getLaunchIntentForPackage(packageName);
context.startActivity(intent );
}
}
(2):配置xml文件,在receiver接收这种添加intent-filter配置
<receiver android:name="TextBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>
(3):添加权限 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Ⅲ Android Service启动方式
1.startService
①.定义一个类继承service
②.在manifest.xml文件中配置该service
③.使用context的startService(intent)启动该service
④.不再使用时,调用stopService(Intent)停止该服务
2.bindService
①.创建bindService服务段,继承自service并在类中,创建一个实现binder接口的实例对象并提供公共方法给客户端调用
②.从onbind()回调方法返回此binder实例
③.在客户端中,从onserviceconnected()回调方法接收binder,并使用提供的方法调用绑定服务
Ⅳ Android 启动后台运行程序(Service)
Android开发中,当需要创建在后台运行的程序的时候,就要使用到Service。Service 可以分为有无限生命和有限生命两种。
特别需要注意的是Service跟Activities是不同的(简单来说可以理解为后台与前台的区别),例如,如果需要使用Service的话,需要调用startService(),从而利用startService()去调用Service中的OnCreate()和onStart()方法来启动一个后台的Service。
启动一个Service的过程如下:context.startService() ->onCreate()- >onStart()->Service running其中onCreate()可以进行一些服务的初始化工作,onStart()则启动服务。
停止一个Service的过程如下:context.stopService() | ->onDestroy() ->Service stop
接下来的实例是一个利用后台服务播放音乐的小例子,点击start运行服务,点击stop停止服务。ServicesDemo.java(是一个Activity)
除此之外还要在Manifest里面声明服务:(AndroidManifest.xml)
定义Service(MyService.java)
layout文件夹中是main.xml
values 文件夹中是strings.xm
Ⅳ android上怎样让一个Service开机自动启动
1. 首先开机尺核启动后系统会发出一个Standard Broadcast Action,名字叫 android.intent.action.BOOT_COMPLETED ,这个Action只会发出一次。2. 构造一个IntentReceiver类, 重构其抽象方法onReceiveIntent(Context context, Intent intent), 在其中带孙启动你想要启动的Service。3.在AndroidManifest. xml中,首先加入 <uses-permission android:name=android.permission.RECEIVE_BOOT_COMPLETED</uses-permission 来获得BOOT_COMPLETED的使用许可,然后注册前面重构的IntentReceiver类,在其 <intent-filter中加入<actionandroid:name=android.intent.action.BOOT_COMPLETED / ,陵行掘以使其能捕捉到这个Action。一个例子xml:<uses-permission android:name=android.permission.RECEIVE_BOOT_COMPLETED</uses-permission <receiver android:name=.OlympicsReceiver android:label=@string/app_name <intent-filter <action android:name=android.intent.action.BOOT_COMPLETED / <category android:name=android.intent.category.LAUNCHER / </intent-filter </receiverjava:public class OlympicsReceiver extends IntentReceiver{/*要接收的intent源*/ static final String ACTION = android.intent.action.BOOT_COMPLETED; public void onReceiveIntent(Context context, Intent intent){if (intent.getAction().equals(ACTION)){context.startService(new Intent(context, OlympicsService.class), null);//启动倒计时服务 Toast.makeText(context, OlympicsReminder service has started!, Toast.LENGTH_LONG).show();}}}注意:现在的IntentReceiver已经变为BroadcastReceiver,OnReceiveIntent为onReceive。所以java这边的代码为: (也可以实现应用程序开机自动启动) public class OlympicsReceiver extends BroadcastReceiver{/*要接收的intent源*/ static final String ACTION = android.intent.action.BOOT_COMPLETED; public void onReceive(Context context, Intent intent){if (intent.getAction().equals(ACTION)){context.startService(new Intent(context, OlympicsService.class), null);//启动倒计时服务//这边可以添加开机自动启动的应用程序代码}}}
Ⅵ Android怎么让一个service开机自动启动
你好,
手机启动完成之后皮圆,系统会发送一个叫android.intent.action.BOOT_COMPLETED的广播,在程序中接收这个广哪枝播,然后启动一个后台服务,就李握敏会实现程序一开机即启动
Ⅶ 安卓怎么自动启动service
1、首先创建一个广播接收者,重构其抽象方法onReceive(Context context, Intent intent),在其中启动你想要启动的Service。import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class BootBroadcastReceiver extends BroadcastReceiver {
//重写onReceive方法
@Override
public void onReceive(Context context, Intent intent) {
//后边的XXX.class就是要启动的服务
Intent service = new Intent(context,XXXclass);
context.startService(service);
Log.v("TAG", "开机自动服务自动启动.....");
}
}
配置xml文件,在receiver接收这种添加intent-filter配置
<receiver android:name="BootBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>
添加权限处理
<!--此权限在高版本中可以省略,你可以测试-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
创建你需要启动的service处理(的XXX)类,并在androidMainfest.xml文件中添加(XXX)service的配置即可。
Ⅷ Android8.0 启动后台Service
在一加手机上,用户升级了新版8.0的系统,用户将app切到后台,过一会儿就弹出“xxx app 已停止运行”的弹窗。
通过定位分析,发现下面俩前置条件
马上跑了26的模拟器,果然复现,日志如下:
我查阅了 android官网 ,有如下一段描述:
解决方法就很简单了,把激清Service互启的逻辑块改为:
有个简写: ContextCompat.startForegroundService(context, intent)
因为我袜橡不想让用户在控制面板看到通知栏,我没有在创建服务后的五秒内调用 startForeground() 。我马上试了一下,果然没有了“已停止运行”,但是日志爆出了另一个ANR的错误,虽然不是在主线程,也没有弹窗,但毕竟是个错误,我想一探究竟。
回到官方的描述:在被启动的Service创建服务后的五秒内调用 startForground(0, new Notification()) ,如果不调用或调用时间明好前超过5秒会抛出一个ANR。
果不其然,我只有调用了,这样更好,有前台进程,系统想杀都杀不掉了。
但仔细看一下官方文档,你会发现,官方推荐使用 JobScheler ,这是api25的新特性。
Ⅸ Android 开机自启动service实践
Android 设备启动的时候,会发送android.intent.action.BOOT_COMPLETED的广播,监听这个广播来实现开机自启动。
1) 创建需要的service和 BroadcastReceiver
2) 在AndroidManifest.xml 注册service 和BroadcastReceiver
3)申明权限
```
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
}
Ⅹ Android怎么让一个service开机自动启动
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了。