今天自学到了一个android运用中的服务概念:
服务,泛指在后台执行的耗时操作。
它的生命周期是:onCreate onStartCommand onDestroy onBind
它的类型在官方上是:启动、绑定;我们通常称为本地服务以及远程服务。
本地服务:onStartCommand获得返回值,远程服务:onBind
服务的停止有两种方式:stopSelf、stopService。前者是在线程中执行停止服务,后者在activity就可以执行。而stopSelf又有两种形式,一种带参,一种不带参。
继承服务类有两种:Service、IntentService。后者有一个类似于onStartCommand作用的方法:onHandleIntent。不过,在继承了intentService的类中需要进行耗时操作不需要写子线程,可直接进行耗时操作
@Override
protected void onHandleIntent(Intent intent) {
for (int i = 0; i <10 ; i++) {
Log.i("test","i="+i);
SystemClock.sleep(200);
}
}
不过,在执行的时候需要在AndroidManifest.xml中配置
<service
android:name=".MyService02"
android:exported="true"></service>
其中MyService02就是继承了IntentService的类,但是这样还不行,会在这行报错,还需要在这个类中加上一个无参的构造函数
public MyService02(){
super("nn");
}
其中,super(“nn”)中的nn是取的一个名,这行代码必须要写,不然也是会报错的。
下面是完整的代码:(当然,这只是服务的启动,也就是本地服务。绑定也就是远程服务在下一篇博客中会写,请谅解,正在研究中)
MyService01 .JAVA
public class MyService01 extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i("test","onBind");
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.i("test","onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String data=intent.getStringExtra("data");
Log.i("test","onStartCommand——"+data);
new MyThread(startId);
return super.onStartCommand(intent, flags, startId);
}
class MyThread extends Thread{
private int startId;
public MyThread(int startId){
this.startId=startId;
}
@Override
public void run() {
super.run();
for (int i = 0; i <10 ; i++) {
Log.i("test","i="+i);
SystemClock.sleep(1000);
}
//在线程全部完成后停止服务
//不带参
//stopSelf();
//带参
stopSelf(startId);
}
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("test","onDestroy");
}
MyService02 .JAVA
public class MyService02 extends IntentService {
public MyService02(){
super("nn");
}
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public MyService02(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
for (int i = 0; i <10 ; i++) {
Log.i("test","i="+i);
SystemClock.sleep(200);
}
}
}
AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".MyService02"
android:exported="true"></service>
</application>
以上,就是今天学到的皮毛,希望对大家会有帮助,如果有不妥的地方,望能在下方评论指出一下,或者私信给我,谢谢!愿每个人每天都能进步!