Service启动,绑定与交互
Posted 丛林小阁楼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Service启动,绑定与交互相关的知识,希望对你有一定的参考价值。
1. Service的启动方式有startServcie和bindService两种。
startService时,会经历onCreate—onStartCommand—onDestroy生命周期,
bindService时,会经历onCreate—onBind—onUnbind—onDestroy生命周期。
2. Service与Activity之间交互时,可以通过bindService获取Service的连接的Binder,进而可以获取Service的引用,这样就可以与Service进行交互了。示例中,通过Service每秒更新TextView一次。
ICounterCallback接口
package com.fxb.servicetest; public interface ICounterCallback { public void count(int val); }
CountService类
package com.fxb.servicetest; import android.app.Service; import android.content.Intent; import android.os.AsyncTask; import android.os.Binder; import android.os.IBinder; import android.support.annotation.Nullable; import android.util.Log; public class CountService extends Service{ private volatile boolean isRunning = true; private CounterBinder counterBinder = new CounterBinder(); @Nullable @Override public IBinder onBind(Intent intent) { Log.i(MainActivity.TAG, "on bind!"); return counterBinder; } public void startCounter(final int value, final ICounterCallback callback){ isRunning = true; new AsyncTask<Integer, Integer, Void>() { @Override protected Void doInBackground(Integer... params) { int count = params[0]; while(isRunning){ try { Thread.sleep(1000); count++; Log.i(MainActivity.TAG, Integer.toString(count)); publishProgress(count); } catch (InterruptedException e) { e.printStackTrace(); } } return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); callback.count(values[0]); } }.execute(0); } public void stopCounter(){ isRunning = false; } @Override public void onCreate() { super.onCreate(); Log.i(MainActivity.TAG, "on create!"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(MainActivity.TAG, "on start command!"); return super.onStartCommand(intent, flags, startId); } @Override public boolean onUnbind(Intent intent) { Log.i(MainActivity.TAG, "on unbind servcie!"); return super.onUnbind(intent); } @Override public void onDestroy() { isRunning = false; Log.i(MainActivity.TAG, "on destroy service"); super.onDestroy(); } @Override public boolean stopService(Intent name) { Log.i(MainActivity.TAG, "on stop service!"); return super.stopService(name); } public class CounterBinder extends Binder{ public CountService getService(){ return CountService.this; } } }
MainActivity类
package com.fxb.servicetest; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity implements View.OnClickListener, ICounterCallback{ public static final String TAG = "ServiceTest"; private TextView tvShow; private Button btnStartServie, btnStopService; private Button btnBindService, btnUnbindService; private Button btnStartCounter, btnStopCounter; private CountService countService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView(){ tvShow = (TextView)findViewById(R.id.tvShow); btnStartServie = (Button)findViewById(R.id.btnStartService); btnStopService = (Button)findViewById(R.id.btnStopService); btnBindService = (Button)findViewById(R.id.btnBindService); btnUnbindService = (Button)findViewById(R.id.btnUnbindService); btnStartCounter = (Button)findViewById(R.id.btnStartCount); btnStopCounter = (Button)findViewById(R.id.btnStopCount); btnStartServie.setOnClickListener(this); btnStopService.setOnClickListener(this); btnBindService.setOnClickListener(this); btnUnbindService.setOnClickListener(this); btnStartCounter.setOnClickListener(this); btnStopCounter.setOnClickListener(this); } private void startCountService(){ Intent intent = new Intent(MainActivity.this, CountService.class); startService(intent); } private void stopCountService(){ Intent intent = new Intent(MainActivity.this, CountService.class); stopService(intent); } private void myBindService(){ Intent intent = new Intent(MainActivity.this, CountService.class); bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); } private void myUnbindService(){ unbindService(serviceConnection); } @Override public void onClick(View v) { if(v == btnStartServie){ Log.i(TAG, "start click"); startCountService(); } else if(v == btnStopService){ stopCountService(); } else if(v == btnBindService){ myBindService(); } else if(v == btnUnbindService){ myUnbindService(); } else if(v == btnStartCounter){ if(countService != null){ countService.startCounter(0, this); } } else if(v == btnStopCounter){ if(v == btnStopCounter){ countService.stopCounter(); } } } @Override public void count(int val) { tvShow.setText("count:"+val); } private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.i(MainActivity.TAG, "service connected!"); CountService.CounterBinder binder = (CountService.CounterBinder)service; countService = binder.getService(); } @Override public void onServiceDisconnected(ComponentName name) { Log.i(MainActivity.TAG, "service disconnected!"); } }; }
在bindService之后,点击startCount后,tvShow每隔1s更新一次,点击stopCount后停止更新。
以上是关于Service启动,绑定与交互的主要内容,如果未能解决你的问题,请参考以下文章
Service的启动,绑定,绑定后通信,跨应用绑定,跨应用绑定后通信