Service
服务是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务
服务并不是运行在一个独立的进程当中,而是依赖于创建服务时所在的应用程序进程。当某个应用程序被杀掉时,所有依赖于该进程的服务也会停止执行(服务运行于宿主进程的主线程中,既不创建自己的线程也不运行在单独的进程中
服务并不会自动开启线程,所有的代码都是运行在主线程当中。因此,我们需要在服务的内部手动创建子线程,并在这里执行具体的任务,否则就有可能出现主线程被阻塞的情况。服务需要在AndroidManifest.xml里注册
四个手动调用方法:
startService()
stopService();
bindService();
unbindService();
五个自调用方法:
onCreate();//创建服务,创建时调用
onStartCommand();//启动服务,每次服务启动时调用
onDestroy;//销毁服务,服务销毁时调用
onBind();//绑定服务,服务绑定时调用
onUnBind();//解除绑定
服务的启动方式:
- startService
- bindService
startService
首先在AndroidManifest.xml中注册
<service android:name=".MyService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.gww.myservice"/>
</intent-filter>
</service>
java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.gww.myservice },可以将隐式改为显示
intent = new Intent(MainActivity.this,MyService.class);
//intent = new Intent("com.gww.myservice");
startService(intent);
public class MyService extends Service {
Thread thread;
@Override
public IBinder onBind(Intent intent) {
Log.d("gwwservice","onBind");
return null;
}
@Override
public void onDestroy() {
Log.d("gwwservice","onDestroy");
}
@Override
public void onCreate() {
Log.d("gwwservice","onCreate");
thread = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0; i < 10; i++){
try {
Log.d("gwwservice",i+"----->");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("gwwservice","onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
}
启动服务时调用onCreate,onStartCommand,关闭时onDestory();
BindService
-
在AndroidManifest.xml中注册服务
<service android:name=".MyBindService" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.gww.mybindservice"/> </intent-filter> </service>
-
创建Service实现对对应方法,创建内部类LocalBinder,返回本服务
package com.example.servicestudent; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; import androidx.annotation.Nullable; public class MyBindService extends Service { public final IBinder mBinder = new LocalBinder(); @Override public IBinder onBind(Intent intent) { Log.d("gwwbindservice","onBind"); return null; } public class LocalBinder extends Binder { public MyBindService getService(){ return MyBindService.this; } } @Override public void onDestroy() { Log.d("gwwbindservice","onDestroy"); } @Override public void onCreate() { Log.d("gwwbindservice","onCreate"); } @Override public boolean onUnbind(Intent intent) { Log.d("gwwbindservice","onUnbind"); return super.onUnbind(intent); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("gwwbindservice","onStartCommand"); return super.onStartCommand(intent, flags, startId); } }
-
在Activity中创建serviceConnection对象并实现对应方法,在onServiceConnected中获得服务
private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { bindService = ((MyBindService.LocalBinder) service).getService(); Log.e("gwwbindservice","onServiceConnected"); } @Override public void onServiceDisconnected(ComponentName name) { Log.e("gwwbindservice","onServiceDisconnected"); bindService = null; } };
-
启动
intent = new Intent(MainActivity.this,MyBindService.class); //intent = new Intent("com.gww.myservice"); bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);
startService启动的生命周期
onCreate() 当Service第一次被创建时,由系统调用。
onStartCommand() 当startService方法启动Service时,该方法被调用。
onDestroy() 当Service不再使用时,由系统调用。
注意:一个startService只会创建一次,销毁一次,但可以开始多次,因此,onCreate()和onDestroy()方法只会被调用一次,而onStart()方法会被调用多次。
bindService启动的生命周期
onCreate() 当Service被创建时,由系统调用。
onBind() 当bindService方法启动Service时,该方法被调用。
onUnbind() 当unbindService方法解除绑定时,该方法被调用。
onDestroy() 当Service不再使用时,由系统调用。
1)当Service组件处于启动状态时,这个时候Service内部可以做一些后台计算,并且不需要和外界有直接的交互。
2)当Service组件处于绑定状态时,这个时候Service内部同样可以进行后台计算,但是处于这种状态时,外界可以很方便地和Service组件进行通信。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rZvSY0Xz-1660023921970)(https://upload-images.jianshu.io/upload_images/8498518-b4a1b458507d1fcb.png?imageMogr2/auto-orient/strip|imageView2/2/w/406/format/webp)]