Android service Binder用法
阿新 • • 發佈:2019-01-24
bsp androidm contex 方法 onbind 並且 all manifest 所有
1.與本地service通信
//在服務裏面新建一個內部類LocalBinder //LocalBinder新增了兩個自己的方法binderFun1(),binderFun2() //LocalBinder的getService()返回當前服務的this對象 /** *在onBinder方法中返回LocalBinder對象,回LocalBinder對象包含了service的句柄, *客戶端通過句柄就可以調用servcie的公共方法funLocalService()了. */ public class LocalService extends Service { @Overridepublic IBinder onBind(Intent intent) { return new LocalBinder(); } public void funLocalService(){ Toast.makeText(this.getApplicationContext(), "fun of LocalService!", Toast.LENGTH_SHORT).show(); } public class LocalBinder extendsBinder { public void binderFun1(){ } public void binderFun2(){ } LocalService getService() { return LocalService .this; } } }
public class ClientActivity extends Activity { private static final String TAG = "ClientActivity "; privateServiceConnection mServiceConnection;
private LocalService.LocalBinder mLocalBinder; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mServiceConnection= new ServiceConnection(){ @Override public void onServiceConnected(ComponentName name, IBinder service) {
//調用LocalBinder自己的方法 mLocalBinder = (LocalService.LocalBinder)service;
mLocalBinder.binderFun1();
mLocalBinder.binderFun1();
//client得到服務LocalService的句柄,便可以調用服務裏面聲明的public方法funLocalService() LocalService mLocalService= ((LocalBinder)service).getService(); mLocalService.funLocalService();
Log.d(TAG, "LocalService is connected"); } @Override public void onServiceDisconnected(ComponentName name) { Log.d(TAG, "LocalService is disconnected"); } }; } @Override protected void onStart() { super.onStart(); Log.d(TAG, this.getApplicationContext().getPackageCodePath()); Intent bindIntent = new Intent(this.getApplicationContext(),LocalService.class);
//綁定服務 this.bindService(bindIntent, mServiceConnection, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop();
//解除綁定服務 this.unbindService(mServiceConnection); } }
2.與另外一個進程中的service進行通信的問題(跨進程通信!)
參考https://www.cnblogs.com/lzjsky/p/4938256.html
AndroidManifest.xml文件中配置service
如何將servcie運行在另外一個進程呢?在manifest 裏面配置個屬性就行了。
android:process=":remote" , 代表這個service運行在同一個應用程序的不同進程中。
android:process
這個屬性用於設定服務所運行的進程名稱。通常,應用程序的所有組件都運行在給應用程序創建的進程中,進程名與應用程序的包名相同。<application>元素的process屬性能夠給應用程序的所有組件設置一個不同的默認名稱。但是每個組件自己的process屬性都能夠覆蓋這個默認值,這樣允許把應用程序分離到不同的多個進程中。
如果這個屬性值用“:”開頭,則在需要的時候系統會創建一個新的,應用程序私有的進程,並且該服務也會運行在這個進程中。如果這個屬性值用小寫字母開頭,那該服務就會運行在以這個屬性值命名的全局進程中,它提供了使其工作的權限。這樣就允許不同的應用程序組件來共享這個進程,從而降低資源的使用。
Android service Binder用法