简介
Service本质作用就是一个没有界面的Activity,它可以在后台执行代码永远不用到前台来,所以一个模块只要不想要与用户交互就可以使用Service。
基本创建
依旧是两种方式一个是as的快捷使用,一个凡事靠自己:
- 快捷使用,可以建立Service和IntentService两种

- 自己来
- 首先在app/src/main/AndroidManifest.xml创建Service标签
- 创建类继承自Service

表示可以使用,而且可以被外部的应用调用这个服务
两种启动模式
StartService
- 在Service配置action标签
- 在MainActiviy中启动Service

MainActivity代码
@Override
public void onCreate() {
super.onCreate();
System.out.println("成功了");
}
MyServie代码
@Override
public void onCreate() {
super.onCreate();
System.out.println("成功了");
}
BindService
- 重写onBind方法并且创建一个类继承自Binder
- 在Activity中初始化ServiceConnection和自己刚刚继承的Binder类
- 调用bindService绑定服务
全部代码
public class MainActivity extends AppCompatActivity {
MyService.MyBinder mBinder;
ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mBinder = (MyService.MyBinder) service;
System.out.println("--------nimeil-------");//没有在OonCreate方法中初始化
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void start(View view) {
Intent intent = new Intent();
intent.setAction("haotianyi.win");
// startService(intent);
bindService(intent, mConnection, MyService.BIND_AUTO_CREATE);
// System.out.println(mBinder.getCount());这时会报空指针异常
}
public void start1(View view) {
System.out.println(mBinder.getCount());
}
}
在连接的时候比较耗时,可能在初始化Service没有及时给mBinder赋值
生命周期

正常的生命周期有两种,有一种比较特殊就是onCreat--->onStartCommend----->onBind--->onUnBind
Start的生命周期

当多次启动Service的时候OnCreate方法只是执行一次,onStartCommand执行多次
Bind的生命周期

无论绑定多少次都是onCreate然后onBind,onServiceConnected是连接成功时候调用的方法
IntentService
Service中也无法执行大量的耗时操作,所以Android官方推出一个IntentService当使用它是时候系统会自动创建一个进程,不会阻塞主线程,开发者只要重写onHandleIntent方法即可:
测试代码
分别再onHandleIntent方法和onStartCommand方法中添加耗时逻辑,看是否弹出ANR:
@Override
protected void onHandleIntent(Intent intent) {
System.out.println("---------onHandleIntent----------");
long endTime = System.currentTimeMillis() + 100 * 1000;
while (System.currentTimeMillis() < endTime) {
synchronized (MyIntentService.this) {
try {
wait(endTime - System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
onStartCommand
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("---------onStartCommand----------");
long endTime = System.currentTimeMillis() + 100 * 1000;
while (System.currentTimeMillis() < endTime) {
synchronized (MyService.this) {
try {
wait(endTime - System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
return super.onStartCommand(intent, flags, startId);
}
在onStartCommand中会弹出:
