1.Activity是程序的最重要部分,負(fù)責(zé)view的控制和data的設(shè)置,簡(jiǎn)單來(lái)說(shuō)就是負(fù)責(zé)調(diào)度。
1.Activity跳轉(zhuǎn)
頁(yè)面跳轉(zhuǎn)是一個(gè)app最基本的操作,那么Activity是如何實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的呢?
它分為顯示和隱式兩種方式,我們先來(lái)看顯示跳轉(zhuǎn)
顯示意圖
創(chuàng)建一個(gè)MyActivity,里面什么代碼也沒(méi)有,只是一個(gè)空的界面,用于被跳轉(zhuǎn)。
那么從程序的入口,MainActivity->MyActivity,顯式調(diào)轉(zhuǎn)即是如下方式,
點(diǎn)擊按鈕,就執(zhí)行跳轉(zhuǎn)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button b = (Button) findViewById(R.id.button);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this,MyActivity.class);
startActivity(intent);
}
});
}
}
這里android有一個(gè)有意思的地方,就是程序的入口可以有多個(gè),就是在Manifest文件中,可以配置多個(gè)程序的入口,從而實(shí)現(xiàn)一個(gè)app有多個(gè)入口的情況。

那么運(yùn)行起來(lái)的時(shí)候就很有意思,就變成了兩個(gè)app

打開(kāi)這兩個(gè)app的話,分別進(jìn)入的就是MainActivity和MyActivity的頁(yè)面
2.正向傳值
創(chuàng)建一個(gè)Person類,用于傳值,需要實(shí)現(xiàn)Serializable 接口,標(biāo)記序列化
public class Person implements Serializable {
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String
toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
傳值
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button= (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Person p = new Person();
p.setAge(10);
p.setName("zhangSan");
Intent intent = new Intent();
intent.putExtra("person", p);
intent.setClass(MainActivity.this, AActivity.class);
startActivity(intent);
}
});
}
}
在AActivity取值
public class AActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
Intent intent = getIntent();
Person person = (Person) intent.getSerializableExtra("person");
Log.v("app", person + "");
}
}
打印結(jié)果
09-01 02:08:03.753 29489-29489/com.mazhan.activity02 V/app: Person{name='zhangSan', age=10}
3.反向傳值
反向傳值和監(jiān)聽(tīng)回傳值的方法,這個(gè)我在之前的Router那一篇有些,感興趣的同學(xué)可以去看一下。
隱式意圖
隱式啟動(dòng)常用于不同應(yīng)用之間的跳轉(zhuǎn)
比如,從一個(gè)app跳轉(zhuǎn)到otherApp,將price傳過(guò)去
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button= (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("price", 10);
intent.setAction("android.intent.action.OtherApp");
startActivity(intent);
}
});
}
}
另一個(gè)app的Manifest中要配置需要被啟動(dòng)的Activity,name和之前的app中一致,android.intent.action.OtherApp
<activity android:name=".AActivity">
<intent-filter>
<action android:name="android.intent.action.OtherApp"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
配置好之后,當(dāng)AActivity被打開(kāi)之后,獲取到從另一個(gè)app傳入的price
public class AActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
Intent intent = getIntent();
int price = intent.getIntExtra("price", 0);
Log.v("app", price + "");
}
}

當(dāng)然還有一種情況是通過(guò)分享鏈接的形式,在外部打開(kāi)app,這種情況也是非常常見(jiàn)的,詳情就參考這篇http://www.itdecent.cn/p/1439c8bbc34b
2.Activity的生命周期
https://blog.csdn.net/ttandroid/article/details/80926753
這個(gè)鏈接寫的很不錯(cuò)
這里補(bǔ)充一點(diǎn)點(diǎn),橫豎屏切換對(duì)于生命周期是有影響的,當(dāng)前的activity會(huì)被銷毀,然后被重建,所以如果不想要這個(gè)過(guò)程的話,可以進(jìn)行設(shè)置
<!--screenOrientation 用來(lái)設(shè)置屏幕方向 -->
<!--configChanges 設(shè)置橫豎屏切換,對(duì)界面的生命周期不影響
orientation 屏幕方向
|screenSize屏幕尺寸
|keyboardHidden 鍵盤隱藏-->
<activity android:name=".MainActivity" android:configChanges="orientation|screenSize|keyboardHidden" android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
3.任務(wù)棧
關(guān)于任務(wù)棧和啟動(dòng)模式,這篇是不錯(cuò)的
https://blog.csdn.net/qq_31860607/article/details/51956239
我再補(bǔ)充一點(diǎn)點(diǎn)
"singleTop"
被設(shè)置為singleTop模式下,就是只有一個(gè)activity的實(shí)例在棧頂
比如說(shuō)A->B->C->D,如果D是singleTop模式,那么就不會(huì)再創(chuàng)建一個(gè)D,而是使用現(xiàn)在的D
如果是A->D->B->C,如果D是singleTop模式,要再start一個(gè)D的話,那就是A->D->B->C->D
也就是說(shuō),只是在被設(shè)置為singleTop的activity在棧頂?shù)臅r(shí)候,再被啟動(dòng)的時(shí)候,才不會(huì)再創(chuàng)建D
"singleTask"
簡(jiǎn)單說(shuō)就是A->B->C->D,如果此時(shí)再啟動(dòng)B的話,那么C和D就會(huì)直接被彈出,變成A->B這樣
"singleInstance"
簡(jiǎn)單說(shuō),A->B->C,D是singleInstance的,如果啟動(dòng)D,那么D就單獨(dú)在一個(gè)任務(wù)棧中,A->B->C單獨(dú)在一個(gè)任務(wù)棧中。
A->B->C這時(shí)候啟動(dòng)D,那么是這樣
A->B->C
D
如果繼續(xù)啟動(dòng)B,那么是這樣
D
A->B->C->B
這個(gè)時(shí)候,如果彈棧的話,就是B退出,C退出,B退出,A退出,D退出。
也就是兩個(gè)任務(wù)棧分開(kāi),只是啟動(dòng)的時(shí)候,會(huì)改變?nèi)蝿?wù)棧的順序,但是在添加activity的時(shí)候,被設(shè)置為singleInstance的任務(wù)棧的activity只有一個(gè)。