Android多進程總結(jié)一:生成多進程(android:process屬性) - lixpjita39的專欄 - CSDN博客請?zhí)砑渔溄用枋?/p>
我們提供的服務有:網(wǎng)站制作、網(wǎng)站建設、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、榕江ssl等。為1000多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術(shù)的榕江網(wǎng)站制作公司
以下兩種方式都是基于bindService啟動服務。
http://www.open-open.com/lib/view/open1469493830770.html
使用Messenger的好處就是如果有多個請求,不會沖突,會將請求放入請求隊列中一個一個執(zhí)行任務。
首先要明確哪個是客戶端,哪個是服務端。
Service是聲明在服務端工程里的,因為要被客戶端工程調(diào)用到,所以是隱式聲明的:
`
`
服務端工程安裝好后,開啟客戶端工程,綁定服務端聲明的服務。(服務端服務不一定要事先開啟了,聲明了即可。)
注意: 客戶端工程隱式調(diào)用服務端開啟的那個service,傳給intent的包名是服務端的包名,并非自己的包名。
`public class MainActivity extends AppCompatActivity {
static final int MSG_SAY_HELLO = 1;
Messenger mService = null;
boolean mBound;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
//接收onBind()傳回來的IBinder,并用它構(gòu)造Messenger
mService = new Messenger(service);
mBound = true;
}
public void onServiceDisconnected(ComponentName className) {
mService = null;
mBound = false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.sample_text).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sayHello(view);
}
});
}
//調(diào)用此方法時會發(fā)送信息給服務端
public void sayHello(View v) {
if (!mBound) return;
//發(fā)送一條信息給服務端
Message msg = Message.obtain(null, MSG_SAY_HELLO, 1, 2);
try {
mService.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
protected void onStart() {
super.onStart();
//綁定服務端的服務,此處的action是service在Manifests文件里面聲明的
Intent intent = new Intent();
intent.setAction("com.lypeer.messenger");
//不要忘記了包名,不寫會報錯
intent.setPackage("com.example.lianxiang.cmakedemo1");
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
// Unbind from the service
if (mBound) {
unbindService(mConnection);
mBound = false;
}
}
}`
這樣,在客戶端就可以操作,實現(xiàn)與服務端工程的一個交互。
Messenger實現(xiàn)的進程間的交互,只是信息的傳遞,客戶端無法直接調(diào)用服務端的方法,所以AIDL就是解決的這個問題。
2)AIDL
http://www.open-open.com/lib/view/open1469493649028.html (上)
https://www.jianshu.com/p/a8e43ad5d7d2 (上面的博客顯示有問題,這個是簡書的版本。)
按照博主所說的,結(jié)果能實現(xiàn)。
2-1)新建aidl文件,注意新建的規(guī)則。
2-2)注意aidl及java類的目錄的問題,并且保證服務端與客戶端都存在aidl與java文件。
2-3)服務端聲明service,service里調(diào)用aidl自動生成的java類。
2-4)客戶端綁定服務端的service,調(diào)用aidl轉(zhuǎn)化的類。