Service
什麼是Service
- service是一個可以在後臺執行、長時間運行而不提供用戶界面的應用組件,也可爲其他應用提供一些功能接口。服務可由其他應用組件啓動,而且即使用戶切換到其他應用,服務仍將在後臺繼續運行。所謂的後臺是相對前臺而言的,具體就是說不依賴於用戶界面。
service不是進程,不是線程。但service運行於所在進程的主線程,它有獨立的生命週期。
Service有哪些應用場景
- 下載文件,播放音樂,購買車票 等等
startService方式啓動Service怎麼做(啓動和停止及生命週期)
private static final String TAG = "servers";
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG, "onCreate: .................." );
}
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
new Thread(new Runnable() {
int content=0;
String name=intent.getStringExtra("name");
@Override
public void run() {
while (content<100){
try {
Thread.sleep(1000);
content++;
Log.e(TAG, "run:........."+content+name );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "onBind: ............." );
return null;
}
@Override
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.servicestart:
Intent intent=new Intent(this,servers.class);
intent.putExtra("name","張三");
startService(intent);
break;
case R.id.servicestop:
Intent intent1=new Intent(this,servers.class);
stopService(intent1);
break;
}
}
bindService方式啓動Service怎麼做(綁定和解綁及生命週期)
int count;
private MyBinder myBinder=new MyBinder();
boolean stopFlag;
private class MyBinder extends Binder{
public int getCount(){
return count;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
System.out.print("執行onBind方法");
return null;
}
@Override
public boolean onUnbind(Intent intent) {
System.out.print("執行onUnbind方法");
return super.onUnbind(intent);
}
@Override
public void onCreate() {
System.out.print("執行onCreate方法");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.print("執行onStartCommand方法");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onRebind(Intent intent) {
super.onRebind(intent);
System.out.print("rebind");
}
@Override
public void onDestroy() {
super.onDestroy();
stopFlag=true;
System.out.print("執行onDestroy");
}
class MyThread extends Thread{
@Override
public void run() {
super.run();
while (!stopFlag){
try {
Thread.sleep(1000);
System.out.print(Thread.currentThread().getName()+"---"+Thread.currentThread().getId());
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
System.out.print(count);
}
}
}
Button Myservicestart,Myservicestop;
Intent intent;
ServiceConnection conn=new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
System.out.print("onServiceConnected");
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
System.out.print("onService");
//MyserviceTwo myserviceTwo=(Myservice.MyBinder)service.getService();
//ms.printServiceName();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_myservices);
binID();
Intent intent=new Intent(this,Myservice.class);
}
private void binID() {
Myservicestart=findViewById(R.id.Myservicestart);
Myservicestop=findViewById(R.id.Myservicestop);
Myservicestart.setOnClickListener(this);
Myservicestop.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.Myservicestart:
bindService(intent, conn, Service.BIND_AUTO_CREATE);
break;
case R.id.Myservicestop:
unbindService(conn);
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
IntentService有什麼不同
- IntentService是繼承Service的,那麼它包含了Service的全部特性,當然也包含service的生命週期,那麼與service不同的是,IntentService在執行onCreate操作的時候,內部開了一個線程,去你執行你的耗時操作。
IntentService怎麼用,注意事項
- IntentService解析及使用規範
IntentService
1 創建類繼承Service
public abstract class IntentService extends Service {
private volatile Looper mServiceLooper;
private volatile ServiceHandler mServiceHandler;
private String mName;
private boolean mRedelivery;
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}
public IntentService(String name) {
super();
mName = name;
}
public void setIntentRedelivery(boolean enabled) {
mRedelivery = enabled;
}
@Override
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
@Override
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
@Override
public void onDestroy() {
mServiceLooper.quit();
}
@Override
@Nullable
public IBinder onBind(Intent intent) {
return null;
}
@WorkerThread
protected abstract void onHandleIntent(@Nullable Intent intent);
}
2 創建Service
- 在Service被創建的時候,使用HandlerThread(繼承於 Thread)創建一個多線程並運行起來,使用HandlerThread線程的Looper來創建一個Handler,使得此Handler處理的所有任務都運行在非主線程裏。
public void onCreate() {
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
3 處理任務
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
-----------------------------------------
@Override
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICK;
}
@WorkerThread
protected abstract void onHandleIntent(@Nullable Intent intent);
4 銷燬Service
- 務執行完畢後會調用stopSelf,在沒有任何任務正在執行或即將執行的情況下Service會停止運行.
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
5 注意事項
- Service停止運行時要注意使用mServiceLooper.quit()退出Looper。如果不提供綁定服務默認返回null。
@Override
public void onDestroy() {
mServiceLooper.quit();
}
@Override
@Nullable
public IBinder onBind(Intent intent) {
return null;
}