Android每次启动服务调用,Android Service两种启动方式

本文详细介绍了Android中Service的两种启动方式:startService和bindService。startService会无限期运行直到stopService,onCreate只在首次启动时调用,onStartCommand会多次调用。bindService是client-server模式,Service生命周期与client绑定状态密切相关,onUnbind和onDestroy在客户端解绑后执行。文章还提供了实例代码和测试分析。
摘要由CSDN通过智能技术生成

第一种方式:通过StartService启动Service

通过startService启动后,service会一直无限期运行下去,只有外部调用了stopService()或stopSelf()方法时,该Service才会停止运行并销毁。

要创建一个这样的Service,你需要让该类继承Service类,然后重写以下方法:

onCreate()

1.如果service没被创建过,调用startService()后会执行onCreate()回调;

2.如果service已处于运行中,调用startService()不会执行onCreate()方法。

也就是说,onCreate()只会在第一次创建service时候调用,多次执行startService()不会重复调用onCreate(),此方法适合完成一些初始化工作。

onStartCommand()

如果多次执行了Context的startService()方法,那么Service的onStartCommand()方法也会相应的多次调用。onStartCommand()方法很重要,我们在该方法中根据传入的Intent参数进行实际的操作,比如会在此处创建一个线程用于下载数据或播放音乐等。

onBind()

Service中的onBind()方法是抽象方法,Service类本身就是抽象类,所以onBind()方法是必须重写的,即使我们用不到。

onDestory()

在销毁的时候会执行Service该方法。

这几个方法都是回调方法,且在主线程中执行,由android操作系统在合适的时机调用。

startService代码实例

创建TestOneService,并在manifest里注册。

在MainActivty中操作TestOneService,code如下:

/**

* Created by Kathy on 17-2-6.

*/

public class TestOneService extends Service{

@Override

public void onCreate() {

Log.i("Kathy","onCreate - Thread ID = " + Thread.currentThread().getId());

super.onCreate();

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

Log.i("Kathy", "onStartCommand - startId = " + startId + ", Thread ID = " + Thread.currentThread().getId());

return super.onStartCommand(intent, flags, startId);

}

@Nullable

@Override

public IBinder onBind(Intent intent) {

Log.i("Kathy", "onBind - Thread ID = " + Thread.currentThread().getId());

return null;

}

@Override

public void onDestroy() {

Log.i("Kathy", "onDestroy - Thread ID = " + Thread.currentThread().getId());

super.onDestroy();

}

}

在MainActivity中三次startService,之后stopService。

/**

* Created by Kathy on 17-2-6.

*/

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.i("Kathy", "Thread ID = " + Thread.currentThread().getId());

Log.i("Kathy", "before StartService");

//连续启动Service

Intent intentOne = new Intent(this, TestOneService.class);

startService(intentOne);

Intent intentTwo = new Intent(this, TestOneService.class);

startService(intentTwo);

Intent intentThree = new Intent(this, TestOneService.class);

startService(intentThree);

//停止Service

Intent intentFour = new Intent(this, TestOneService.class);

stopService(intentFour);

//再次启动Service

Intent intentFive = new Intent(this, TestOneService.class);

startService(intentFive);

Log.i("Kathy", "after StartService");

}

}

打印出的Log如下:

02-06 15:19:45.090 8938-8938/? I/Kathy: Thread ID = 1

02-06 15:19:45.090 8938-8938/? I/Kathy: before StartService

02-06 15:19:45.233 8938-8938/? I/Kathy: onCreate - Thread ID = 1

02-06 15:19:45.234 8938-8938/? I/Kathy: onStartCommand - startId = 1, Thread ID = 1

02-06 15:19:45.234 8938-8938/? I/Kathy: onStartCommand - startId = 2, Thread ID = 1

02-06 15:19:45.235 8938-8938/? I/Kathy: onStartCommand - startId = 3, Thread ID = 1

02-06 15:19:45.236 8938-8938/? I/Kathy: onDestroy - Thread ID = 1

02-06 15:19:45.237 8938-8938/? I/Kathy: onCreate - Thread ID = 1

02-06 15:19:45.237 8938-8938/? I/Kathy: onStartCommand - startId = 1, Thread ID = 1

02-06 15:19:45.238 8938-8938/? I/Kathy: after StartService

分析:

1.主线程打印出是1,所有回调方法中打印出的执行线程ID都是1,证明回调方法都是在主线程中执行的。

2.三次调用startService,只触发一次onCreate回调,触发了三次onStartCommand回调,且startId分别为1,2,3。证明 多次startService不会重复执行onCreate回调,但每次都会执行onStartCommand回调。

第二种方式:通过bindService启动Service

bindService启动服务特点:

1.bindService启动的服务和调用者之间是典型的client-server模式。调用者是client,service则是server端。service只有一个,但绑定到service

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值