難道我學習的是Service?
阿新 • • 發佈:2019-01-08
最新劇情,看完拼死前往約定地點的船長,真的很感動啊,布魯克也很強啊。
————————我是正文的分割線————
什麼是Service?
在Android王國中,Service是一個勞動模範,總是默默的在後臺執行,無怨無悔,且總是幹最髒最累的活,比如下載檔案,傾聽音樂,網路操作等這些耗時的操作,所以我們請尊重的叫他一聲:"勞模,您辛苦了".
Service 是一個應用程式元件
它能在後臺執行一些耗時較長的操作.
並且不提供使用者介面
服務能被其它的應用程式元件啟動,即使使用者切換到其他的應用程式時還能保持在後臺執行.
服務不是一個執行緒,它執行在主執行緒.
Intent intent =newIntent(ServiceActivity.this,FirstService.class);
startService(intent);
生命週期onCreate(), onStartCommand(), onDestory()就這三個生命週期 --FirstService-->:Service is running.
--FirstService-->: onCreate is running.
--FirstService-->: onStartCommand is running.
我們在onStartCommand方法中列印下當前執行緒@Override
publicint onStartCommand(Intent intent,int flags,int startId){
Log.i(TAG,"onStartCommand is running.Thread:"+Thread.currentThread());
returnsuper.onStartCommand(intent, flags, startId);
}
列印結果如下:
onStartCommand is running.Thread:Thread[main,5,main]
驗證了兩點:①由於是第二次執行,構造方法和onStart都沒有列印,說明服務一旦啟動是默默執行在後臺的;②服務是執行在主執行緒的
如何結束服務:①呼叫stopService()方法 ,會回撥service的onDestory()方法;Intent intent2 =newIntent(ServiceActivity.this,FirstService.class);
stopService(intent2);
還可以在Android系統設定-->應用-->正在執行-->找到後是如下樣式,會告訴我們有一個服務在執行;
建立自定義類繼承Service重寫方法
public class MyService extends Service {
private static final String TAG = "MyService";
public MyService() {
}
//重寫onCreate(),列印
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG+Thread.currentThread().toString(), "onCreate: " );
}
//重寫onStartCommand,列印,在裡面寫一個子執行緒,實現倒計時功能
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand: " );
new Thread(new Runnable() {
@Override
public void run() {
for(int i=10;i>=0;i--){
Log.e(TAG+Thread.currentThread().toString(), "run: "+"----"+i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
//重寫onBind()方法
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
Log.e(TAG, "onBind: " );
throw new UnsupportedOperationException("Not yet implemented");
// return mBinder;
}
// private DownloadBinder mBinder = new DownloadBinder();
// class DownloadBinder extends Binder{
//
// public void startDownload (){
// Log.e(TAG, "startDownload: " );
//
// }
// public int getProgress(){
// Log.e(TAG, "getProgress: " );
// return 0;
// }
//
// }
//重寫onDestroy()
@Override
public void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy: " );
}
}
在context環境啟動服務
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button startBtn;
private Button stopBtn;
private Button bindBtn;
private Button unBindBtn;
private EditText editText;
private TextView textView;
private Intent startIntent;
// private MyService.DownloadBinder downloadBinder ;
// private ServiceConnection connection = new ServiceConnection() {
// @Override
// public void onServiceConnected(ComponentName name, IBinder service) {
// downloadBinder = (MyService.DownloadBinder) service;
// downloadBinder.startDownload();
// downloadBinder.getProgress();
//
// }
//
// @Override
// public void onServiceDisconnected(ComponentName name) {
//
// }
// };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bangID();
}
private void bangID() {
startBtn = findViewById(R.id.main_start_btn);
stopBtn = findViewById(R.id.main_stop_btn);
bindBtn = findViewById(R.id.main_bind_btn);
unBindBtn = findViewById(R.id.main_unbind_btn);
editText = findViewById(R.id.main_et);
textView = findViewById(R.id.main_tv);
startBtn.setOnClickListener(this);
stopBtn.setOnClickListener(this);
bindBtn.setOnClickListener(this);
unBindBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.main_start_btn:
//啟動服務
startIntent = new Intent(MainActivity.this,MyService.class);
this.startService(startIntent);
break;
case R.id.main_stop_btn:
//關閉服務
this.stopService(startIntent);
break;
// case R.id.main_bind_btn:
// Intent bindIntent = new Intent(MainActivity.this,MyService.class);
// this.bindService(bindIntent,connection,BIND_AUTO_CREATE);
// break;
// case R.id.main_unbind_btn:
// unbindService(connection);
// break;
default:
}
}
}