玩轉(zhuǎn)Activity

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è)入口的情況。


image.png

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


image.png

打開(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 + "");

    }
}
image.png

當(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è)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容