Android活動+《恐怖遊輪》帶你瞭解跳轉&傳遞數據&如何隨時結束程序&小技巧

在這裏插入圖片描述

1.到達船塢,衆人出海(頁面跳轉,數據傳遞)

一個風和日麗的下午,潔西被朋友邀請出海航行,但冥冥中她總覺得,周圍的一切都充滿奇怪的熟悉感。
在這裏插入圖片描述
她收拾好東西,透過窗戶,孩子正在塗塗畫畫。
在這裏插入圖片描述匆忙收拾好灑在地上的墨水
在這裏插入圖片描述有人按她家的門鈴,她卻不知道是誰,出門問了Jack老大爺,他說沒看到。
四處透露着莫名的詭異。

故事開始了

工程只要包含Activity,那麼在啓動這個應用的時候都需要指定一個啓動頁作爲初始頁。也就是我們打開app第一眼看到的頁面。
我們需要在AndroidMainfest.xml中來指定那個活動作爲啓動頁。具體的方式如下:

        <activity android:name=".Login">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

傑西驅車來到了船塢,和葛雷一行人會面。
在這裏插入圖片描述

1.1驅車前往:Intent

Intent主要用於在組件中進行跳轉或者傳遞數據,在這裏我們用到了跳轉活動和傳遞數據

活動由 由家到達船塢 intent這個小車載着數據 傑西來到了船塢
這個小車我們要如何實現呢?

Intent intent=new Intent(HomeActivity.this,DockActivity.class);

這就是小車了,這個小車的作用就是從家到船塢
那麼光車去了也不行,傑西也得跟着去呀。

1.2傑西上車:putExtra

String name="傑西";
intent.putExtra("data",name);

可以通過intent.putExtra() 來爲intent攜帶數據。當然還有其他的方式來實現。以後慢慢會接觸到。
然後傑西上車後,
車子啓動:startActivity(intent)

satrtActivity(intent)

於是綁定控件後完整的代碼如下:

        Button red_car=findViewById(R.id.button1);
        red_car.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(Login.this,MainActivity.class);
                String name="傑西";
                intent.putExtra("data",name);
                startActivity(intent);
            }
        });

在這裏插入圖片描述
傑西到達船塢,此時在船塢中,葛雷(傑西的朋友),維克多(葛雷的室友),莎莉(葛雷的朋友),東尼,海瑟(莎莉的朋友)已經到達了船廠。

public class DockActivity extends AppCompatActivity {
    String person="目前在船廠有葛雷,維克多,薩利,東尼,海瑟,";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dock_activity);
        final TextView text=findViewById(R.id.textView3);
        text.setText(person);
    }
}

在這裏插入圖片描述

1.3傑西下車:在跳轉後的界面取數據

如果我們要在跳轉後的界面進行取數據的操作可以使用以下代碼:
Intent intent=getIntent();
String jess=intent.getStringExtra(“data”);
其中data就是我們在跳轉時填寫的變量。是唯一的

     Button out_car=findViewById(R.id.button);
        out_car.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=getIntent();
                String jess=intent.getStringExtra("data");
                person=person+jess;
                text.setText(person);
            }
        });

在這裏我們將下車綁定在控件上,用點擊監聽事件觸發下車這個動作。
傑西下車在這裏插入圖片描述
此時船塢的所有人全部到齊了
在這裏插入圖片描述

葛雷看到傑西來到船塢,前來打招呼(傑西是個單親媽媽,這個葛雷其實對傑西有意思=。=)
在這裏插入圖片描述
傑西的狀態不是很好,葛雷非常體貼,說:我們可以換個日子,但是傑西卻堅持出海了。
於是,他們一同又一次踏上了死亡之旅。
等等。。
爲什麼要用 “又”?

在這裏插入圖片描述

2.遭遇風暴,郵輪獲救(數據回傳(請求與獲取))

船隻在海面上平穩的航行,傑西躺在船艙內的牀上,她夢到了一個場景,她被衝到岸邊,撕碎的衣服被海浪肆意翻卷。
在這裏插入圖片描述在這裏插入圖片描述突然她從夢中醒來。
暴風雨之前總是平靜的,一剎那,風停。船隻停留在海面上,彷彿靜止。
在這裏插入圖片描述
後大風驟起,海面掛起狂風。暴風雨來了
在這裏插入圖片描述

2.1數據回傳(請求)tips:正確的邏輯順序爲2.1->3.2->2.2

在狂風驟雨之中,葛雷的船發出了求救信號,但是卻收到了一個奇怪的回覆(注意,數據回傳)
“我們需要求救,有船隻能夠救援嗎?“

通過startActivityForResult(Intent intent,requestCode int);來傳遞一個信號,根據requestCode來匹配獲得下個活動處理後得到的數據。

        Intent intent=new Intent(DockActivity.this,CruiseActivity.class);
        String data="我們需要求救,你們的船隻位置哪裏?";
        intent.putExtra("help",data);
        startActivityForResult(intent,1);

在這裏發出的請求就是 requestCode=1;當有船只收到這個quest的時候可以處理這個請求。

之後葛雷卻收到了一個奇怪的回覆:“help me!!!(隨後信號混亂,中斷)”
那麼我們在這裏是如何接受這個回覆並處理回覆帶的數據的呢??

我們在回傳活動的部分需要重寫onActivityResult方法來處理收到的數據。在這裏使用到了三個參數,第一個就是requstCode, 就是我們發出的1,用來判斷是不是回覆我們的,
第二個參數是resultCode,用來判斷是不是成功回覆了,也就是能不能接通。第三個data,用來判斷內容。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        switch (requestCode)
        {
            case 1:
                if(resultCode==RESULT_OK)
                {
                    String respond=data.getStringExtra("request");
                }
        }
    }

2.2數據回傳(獲取)

在這裏有船只收到了葛雷的信息,並且給與了回覆,回覆的內容是這樣的“help me!!”

隨後,船隻禁受不住颶風,傾覆了,衆人落水,海瑟由於想撩男主被海浪捲走了。領盒飯
剩下的人獲救,但是船隻損壞了。活動結束
後衆人遇到了噩夢的開端 AEOLUS郵輪
在這裏插入圖片描述
衆人發現這個郵輪上有人在觀察他們,但是一閃而逝。
隨後登船獲救

        Button save=findViewById(R.id.button6);
        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(DockActivity.this,CruiseActivity.class);
                intent.putExtra("data1","葛雷,傑西,維克多,薩利,東尼");
                startActivity(intent);
                finish();

            }
        });

3.衆人遇難,傑西發現黑衣人(保存臨時數據與數據回傳(發送數據))

登上船隻後,傑西對這個地方的熟悉感越發的強烈。但此時她不知道的是,一個黑衣人已經虎視眈眈,想要殺掉他們所有人。

3.1始終存在的黑衣人:如何保存活動內的臨時數據防止切換頁面在切回導致的數據消失?

我們需要在活動內重寫savedInstanceState方法來保存我們想要保存的臨時數據。在方法內部使用outState中的putString方法來保存字符串類型的數據,其他數據同理。

    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        String drakkiller="黑衣人";
        outState.putString("darkkiller",drakkiller);
    }

如果我們要調用保存的臨時數據可以在onCreate方法中書寫如下代碼:

if(savedInstanceState!=null)
{
	String darkkiller1=savedInstanceState.getString("darkkiller");
	## 利用數據 ##
}

傑西不好的預感越發強烈
在這裏插入圖片描述然而事實也是如此,再此之後,朋友們接連被一個蒙面的黑衣人殺害,其中有人發現這個想要殺掉他們的人竟然是傑西,於是當朋友們來找說法的時候,傑西蒙了,並極力否認並不是她。
場面血腥,不過分描述。請自行觀看=。=
傑西在船艙找到了通訊室,於是向外發出了求救信號。(注意,數據回傳)
之後當傑西與黑衣人碰見的時候,體內的戰士之魂爆發了
在這裏插入圖片描述最後反殺了黑衣人,但是當黑衣人墜入海中前,她說出了一句讓人難以理解的話:
“你必須要殺掉他們,這是回家的唯一方法,殺了他們,殺了他們,殺了他們!”
在這裏插入圖片描述傑西以爲這是結束,但她不知道的是,這纔是剛剛開始。
當她關掉音樂盒卻聽到了呼救聲音,這時候她驚詫的發現…
這是她們落海時呼救的場景!
在這裏插入圖片描述在這裏插入圖片描述

一切又來了一遍,這是這次,她成了船上的人。
此時她明白了一件事,當時在船艙內收到的奇怪求救信號,就是她在船艙內呼救發出的!

3.2輪迴的呼救信號:數據回傳(發送數據)

這時候一切都清楚了,當初在船內的信號就是她發出的,而這個回覆,回傳到小船上的信號,是這樣實現的。

                Intent intent=new Intent();
                intent.putExtra("requset","help me!!");
                setResult(RESULT_OK,intent);
                finish();

跳轉後的界面如果向向前一個界面回傳數據,需要以下兩個參數,resultCode和data,也就是處理結果以及附帶的數據。這裏用setResult來將結果與數據傳遞迴上一個活動。這裏的Intent()不參與頁面跳轉,只進行數據的傳遞。

3.3總結一下數據回傳

數據回傳的過程其實就是 需要回傳數據的活動發送一個requsetCode,然後收到這個requsetCode的活動根據收到的信息處理數據並給於反饋,反饋包括處理結果resultCode和返回的處理數據。然後我們需要在需要回傳數據的活動內重寫onActivityResult方法來處理收到的數據。

4.無限的輪迴(知曉當前啓動的活動)

此時的她心靈收到了極大地衝擊,滿腦子都是一句話“只有殺掉他們你才能回家”
她的兒子還在家等她,爲了她的兒子,她蒙上了面,拿起了武器。開始了新的一次輪迴。
她沒有反應過來的是,此時她已然成爲了那個黑衣人。於是她展開了行動
當她再一次殺掉除了傑西的所有人後,她悲哀的發現,自己成爲了那個被殺掉的人。
當傑西再次醒來,她發現她又一次回到了船上,然而這次,她發現地上都是重複的一張張紙條,寫滿了殺掉他們,在那個她不經意掉落吊墜的下水井,竟然滿都是吊墜
在這裏插入圖片描述在這裏插入圖片描述
這就告訴我們一件事,當活動比較多的時候,需要知道啓動了那個活動並且能夠對活動進行管理。

4.1這究竟是哪一次輪迴!:如何知曉當前在哪一個活動

當活動比較多的時候,我們可以需要來很好的分辨現在處於哪個活動當中。爲此我們需要創建一個BasicActivity類,然後去繼承AppCompatActivity類,在BasicActivity內實現提示我們所處類的方法。
重寫onCreat方法

首先創建一個BasicActivity,然後繼承AppCompatActivity類

public class BasicActivity extends AppCompatActivity

然後我們重寫onCreate方法來顯示我們所在的活動位置。

        Log.d("BasicActivity",getClass().getSimpleName());

通過這個代碼可以在Logcat內看到我們當前所處的活動。
每當我們創建一個活動的時候,都去繼承BasicActivity 當我們運行至此活動時就會顯示。

2020-03-21 23:02:27.476 20117-20117/com.example.firstacitivity D/BasicActivity: DockActivity
2020-03-21 23:02:48.223 20117-20117/com.example.firstacitivity D/BasicActivity: CruiseActivity

5.無法終結的輪迴(如何終結掉所有活動直接退出)

她終於明白了一件事,這是一個輪迴,只有她逃脫郵輪纔有希望擺脫這玩笑一般的厄運。於是她不斷地重複之前的過程,在船頭堆滿了她,或者說以前的她的屍體。
在這裏插入圖片描述天曉得她已經來過這裏多少次了,只有能夠逃脫這裏她才能夠回去見到自己的兒子!
作爲黑衣人的她落到水裏,也沒有死。她在沙灘上醒來,夢中的情節再次出現。
在這裏插入圖片描述
她被衝到岸邊,撕碎的衣服被海浪肆意翻卷。
她知道自己成功了,她回到了陸地上!
她爲了自己的兒子拼命地回到家看到兒子依舊在畫畫,熟悉的畫面涌上心頭,堅強的傑西哭了TAT
在這裏插入圖片描述
但是在之後卻親眼看到了自己因爲自閉症兒子把她買的船扔到水池裏而被狠狠的責罵,原來這一切都是曾經發生過得,她在之前是個不折不扣的暴力狂
在這裏插入圖片描述
她看到了自己因爲孩子打翻墨水而大打出手
在這裏插入圖片描述
她努力了這麼久但她不是一個好媽媽,但經歷了這麼多讓他對兒子充滿了愧疚和愛,於是她殺了自己。

然後她抱着孩子說:
在這裏插入圖片描述

但是其實殊不知,

纔是剛剛開始。

5.1 所以到底該怎麼終結這個輪迴?!:一鍵結束所有活動

如果想要結局,那麼用代碼真的很簡單。

我們只需要創建一個ActivityControl類然後書寫以下代碼

public class ActivityControl {
    public static List<Activity>activities=new ArrayList<>();
    public static void addActivity(Activity activity)
    {
        activities.add(activity);
    }
    public static void removeActivity(Activity activity)
    {
        activities.remove(activity);
    }
    public static void removeAllActivity()
    {
        for (Activity activity:activities)
        {
            if(!activity.isFinishing())
            {
                activity.finish();
            }
        }
        activities.clear();
    }
}

在這裏我們定義了一個列表來儲存所有的活動,然後定義了增加活動,移除活動以及結束所有活動的方法。
然後我們在以上的基礎上加入到BasicActivity類中,重寫onDestroy方法和onCreat方法。

public class BasicActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("BasicActivity",getClass().getSimpleName());
        ActivityControl.addActivity(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityControl.removeActivity(this);
    }
}

接下來當我們需要在某個界面結束掉所有活動的時候,只需要調用一下以下代碼就可以實現一鍵關掉所有活動了!!!

   ActivityControl.removeAllActivity();

這個電影真的很好看!希望看過的朋友們有時間能夠在去重溫一下!裏面的很多細節我記不住了有的地方可能有偏差,希望大家不要怪罪。沒有看過的朋友們我不希望你們看到這句話!因爲這就代表你們看到了劇透!!!!如果想要小demo瞭解這幾個實現的具體細節可以私信我,最後希望大家能邊看邊學,掌握關於活動的一些使用技巧。下期再見!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章