android---service和activity之间通信方式之Binder

来源:互联网 发布:linux启动数据库命令 编辑:程序博客网 时间:2024/05/21 22:31

当Activity通过调用bindService(Intent service, ServiceConnection conn,int flags),得到一个Service的一个对象实例,然后可以访问Service中的方法。我们可以通过一个例子来解释一下


MainActivity.java

package com.example.android_service_activty_tran;import com.example.android_service_activty_tran.DownLoadService.LocalBinder;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.os.Parcel;import android.os.RemoteException;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity {private Button button1,button2,button3,button4;private TextView textView1;private boolean flag;private DownLoadService downLoadService;private LocalBinder localBinder;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button1 = (Button) this.findViewById(R.id.button1);button2 = (Button) this.findViewById(R.id.button2);button3 = (Button) this.findViewById(R.id.button3);button4 = (Button) this.findViewById(R.id.button4);textView1 = (TextView) this.findViewById(R.id.textView1);button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//int value = downLoadService.getRandom();//绑定service}});button2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (flag) {int value = downLoadService.getRandom();textView1.setText("---"+value);}}});button3.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {unbindService(connection);flag = false;}});button4.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//向service中传递数据Parcel data = Parcel.obtain();data.writeInt(23);data.writeString("jack");//从service中获取数据Parcel reply = Parcel.obtain();try {localBinder.transact(IBinder.LAST_CALL_TRANSACTION,data, reply, 0);} catch (RemoteException e) {e.printStackTrace();}System.out.println("---从service中回传的值"+reply.readInt());System.out.println("---从service中回传的值"+reply.readString());}});}@Overrideprotected void onStart() {super.onStart();Intent intent = new Intent(this, DownLoadService.class);bindService(intent, connection, Context.BIND_AUTO_CREATE);}//接触与service的绑定@Overrideprotected void onStop() {super.onStop();}public ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {flag = false;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {localBinder = (LocalBinder) service;downLoadService = localBinder.getService();flag = true;}};@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}}
DownLoadService.java

package com.example.android_service_activty_tran;import java.util.Random;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;import android.os.Parcel;import android.os.RemoteException;import android.util.Log;public class DownLoadService extends Service {private final String TAG = "DownLoadService";private Binder localBinder = new LocalBinder();private Random random = new Random();public DownLoadService() {}/** * 在Service中自定义方法:通常是提供Client调用,通常是Activtiy调用的 * @return */public int getRandom() {return random.nextInt(100);}public class LocalBinder extends Binder {public DownLoadService getService() {return DownLoadService.this;}@Overrideprotected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {System.out.println("---从Activity中获取的值"+data.readInt());System.out.println("---从Activity中获取的值"+data.readString());reply.writeInt(getRandom());reply.writeString("rose+jack");return super.onTransact(code, data, reply, flags);}}@Overridepublic void onCreate() {Log.i(TAG, "---oncreate");super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i(TAG, "---onStartCommand");return super.onStartCommand(intent, flags, startId);}@Overridepublic boolean onUnbind(Intent intent) {Log.i(TAG, "---onUnbind");return super.onUnbind(intent);}@Overridepublic IBinder onBind(Intent intent) {Log.i(TAG, "---onBind");return localBinder;}@Overridepublic void onRebind(Intent intent) {Log.i(TAG, "---onRebind");super.onRebind(intent);}@Overridepublic void onDestroy() {Log.i(TAG, "---onDestroy");super.onDestroy();}}



1 0