Activity與Service是否處于同一進(jìn)程
一般來說:同一個(gè)包內(nèi)的activity和service空盼,如果service沒有設(shè)定屬性Android:process=":remote"的話稠集,service會(huì)和activity跑在同一個(gè)進(jìn)程中,而且service和acitivity就是在同一個(gè)線程(ActivityThread)里面的央碟。
當(dāng)Acitivity和Service處于同一個(gè)Application和進(jìn)程時(shí)景馁,通過繼承Binder類來實(shí)現(xiàn)
public class MyService extends Service {
private DownloadBinder mBinder = new DownloadBinder();
public MyService() {}
class DownloadBinder extends Binder {
public void startDownload() {
Log.d("MyService", "startDownload executed");
}
public int getProgress() {
Log.d("MyService", "getProgress executed");
return 0;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private MyService.DownloadBinder downloadBinder;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
downloadBinder = (MyService.DownloadBinder) service;
downloadBinder.startDownload();
downloadBinder.getProgress();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bindService = (Button) findViewById(R.id.bind_service);
Button unbindService = (Button) findViewById(R.id.unbind_service);
bindService.setOnClickListener(this);
unbindService.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bind_service:
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
break;
case R.id.unbind_service:
unbindService(connection);
break;
default:
break;
}
}
}
Task
task是一組相互關(guān)聯(lián)的activity的集合,存在于一個(gè)稱為back stack的數(shù)據(jù)結(jié)構(gòu)中坦喘,framework是以棧的形式管理用戶開啟的activity烤镐。task是可以跨應(yīng)用的蛋济,
四種啟動(dòng)模式
standard
標(biāo)準(zhǔn)啟動(dòng)模式,也是activity的默認(rèn)啟動(dòng)模式炮叶。如果Activity A的啟動(dòng)模式為standard碗旅,并且A已經(jīng)啟動(dòng),在A中再次啟動(dòng)Activity A悴灵,當(dāng)前的桟中的狀態(tài)為A-->A。
singleTop
如果一個(gè)以singleTop模式啟動(dòng)的activity的實(shí)例已經(jīng)存在于任務(wù)桟的桟頂骂蓖,那么再啟動(dòng)這個(gè)Activity時(shí)积瞒,不會(huì)創(chuàng)建新的實(shí)例,而是重用位于棧頂?shù)哪莻€(gè)實(shí)例登下,并且會(huì)調(diào)用該實(shí)例的onNewIntent()方法將Intent對(duì)象傳遞到這個(gè)實(shí)例中茫孔。
如果以singleTop模式啟動(dòng)的activity的一個(gè)實(shí)例已經(jīng)存在與任務(wù)桟中,但是不在桟頂被芳,那么它的行為和standard模式相同缰贝,也會(huì)創(chuàng)建多個(gè)實(shí)例。
singleTask
如果一個(gè)activity的啟動(dòng)模式為singleTask畔濒,那么這個(gè)activity如果已經(jīng)創(chuàng)建剩晴,則會(huì)remove 掉它上面的Activity,如果沒有創(chuàng)建侵状,這里要看taskAffinity(一個(gè)任務(wù)的taskAffinity決定于這個(gè)任務(wù)的根activity)赞弥,如果 taskAffinity 相同則在棧頂啟動(dòng),如果不同趣兄,則會(huì)在 taskAffinity對(duì)應(yīng)的棧棧頂創(chuàng)建绽左,如果棧不存在,則創(chuàng)建棧艇潭。
如果不同app中的Activity 具有相同的taskAffinity拼窥,那么這兩個(gè) Activity 會(huì)被分配到同一個(gè)task 中去
singleInstance
總是在新的任務(wù)中開啟,并且這個(gè)新的任務(wù)中有且只有這一個(gè)實(shí)例蹋凝,也就是說被該實(shí)例啟動(dòng)的其他activity會(huì)自動(dòng)運(yùn)行于另一個(gè)任務(wù)中鲁纠。當(dāng)再次啟動(dòng)該activity的實(shí)例時(shí),會(huì)重用已存在的任務(wù)和實(shí)例鳍寂。并且會(huì)調(diào)用這個(gè)實(shí)例的onNewIntent()方法房交,將Intent實(shí)例傳遞到該實(shí)例中。同一時(shí)刻在系統(tǒng)中只會(huì)存在一個(gè)這樣的Activity實(shí)例伐割。
- 以singleInstance模式啟動(dòng)的Activity在整個(gè)系統(tǒng)中是唯一的
- singleInstance模式啟動(dòng)的Activity具有獨(dú)占性候味,即它會(huì)獨(dú)自占用一個(gè)任務(wù)刃唤,被他開啟的任何activity都會(huì)運(yùn)行在其他任務(wù)中
- 被singleInstance模式的Activity A在開啟另一activity B時(shí),能夠開啟一個(gè)新任務(wù)白群,但是是不是真的開啟新任務(wù)尚胞,需要根據(jù)當(dāng)前系統(tǒng)中是不是已經(jīng)有了一個(gè)activity B的taskAffinity屬性指定的任務(wù)。