Activity的呼叫轉移*(3個Activity之間的跳轉)

Redirection的意思就是“呼叫轉移,重寄”的意思

我們也許會再程序開發中遇到這種情況,需要從一個Activity(A)跳轉到另一個Activity(B),當在這個Activity(B)中處理完一些操作后在返回到之前的Activity(A)。常用的方法是在A中調用startActivityForResult(intent, requestCode);來跳轉到B,并在A中重寫方法:

protected void onActivityResult(int requestCode, int resultCode,Intent data) {........ },在B中處理完操作后調用語句:setResult(resultCode);來返回A并執行A中的onActivityResult(int requestCode, int resultCode,Intent data)方法。

(為了方便起見,下文中提到的ABC都是3個不同的Activity)

如果我們需要從A跳轉到B,在B中處理完一些操作后返回到C,在C中我們可以分別跳轉到A或者B中。哪么你會怎么做呢?如果你是用:startActivity(intent);這種最初級的Activity之間的跳轉,那么只能說你還是個初級入門的android開發者。下面我來講解下Rediretion這個Demo。交你巧妙的實現Activity之間的跳轉。

首先看下第一個Activity(A)中的代碼:

Activity A:

public class RedirectEnter extends Activity
{
??? @Override
?protected void onCreate(Bundle savedInstanceState)
??? {
??????? super.onCreate(savedInstanceState);

??????? setContentView(R.layout.redirect_enter);

??????? // Watch for button clicks.
??????? Button goButton = (Button)findViewById(R.id.go);
??????? goButton.setOnClickListener(mGoListener);
??? }

??? private OnClickListener mGoListener = new OnClickListener()
??? {
??????? public void onClick(View v)
??????? {
??????????? // Here we start up the main entry point of our redirection
??????????? // example.
??????????? Intent intent = new Intent(RedirectEnter.this, RedirectMain.class);//跳轉到Activity(C)
??????????? startActivity(intent);
??????? }
??? };
}

很簡單的一段代碼,一個按鈕跳轉到下一個Activity(C)。

也許你會感到奇怪,為什么是C而不是B呢?是不是我打錯了?其實就是C啦。我來說下這里的原理也是重點(其實很簡單,講的多只是想讓入門的朋友能更明白)。

A跳轉到B,其實是A先到C然后在到B,只是A剛剛跳轉到C還沒有顯示任何東西的時候又直接跳轉到B了。所以我們根本察覺不到C的存在,但恰恰相反,C是這個例子中最重要的地方,也是最復雜的地方,下面我們直接說C(B就很好理解了)。

Activity C:

public class RedirectMain extends Activity {
??? static final int INIT_TEXT_REQUEST = 0;
??? static final int NEW_TEXT_REQUEST = 1;

??? @Override
?protected void onCreate(Bundle savedInstanceState) {
??????? super.onCreate(savedInstanceState);

??????? setContentView(R.layout.redirect_main);

??????? // Watch for button clicks.
??????? Button clearButton = (Button)findViewById(R.id.clear);
??????? clearButton.setOnClickListener(mClearListener);
??????? Button newButton = (Button)findViewById(R.id.newView);
??????? newButton.setOnClickListener(mNewListener);

//這里就是關鍵,程序第一次加載時loadPrefs()方法的返回值一定是false,所以直接在跳轉到B了。

??????? if (!loadPrefs()) {
??????????? Intent intent = new Intent(this, RedirectGetter.class);
??????????? startActivityForResult(intent, INIT_TEXT_REQUEST);
??????? }
??? }

??? @Override
?protected void onActivityResult(int requestCode, int resultCode,
??Intent data) {
??????? if (requestCode == INIT_TEXT_REQUEST) {

?????//如果我們在B中點擊返回按鈕,那么默認的resultCode是?RESULT_CANCELED,所以關閉當前Activity,就又放回到A了。(第一次請求時)

?????????? if (resultCode == RESULT_CANCELED) {
??????????????? finish();

??????????? // Otherwise, there now should be text...? reload the prefs,
??????????? // and show our UI.? (Optionally we could verify that the text
??????????? // is now set and exit if it isn't.)
??????????? } else {
??????????????? loadPrefs();//執行loadPrefs(),這時RedirectData.xml文件中的text鍵已經不為null了。因為在B中為它設置了值。
??????????? }

??????? } else if (requestCode == NEW_TEXT_REQUEST) {??

??????????? // In this case we are just changing the text, so if it was
??????????? // cancelled then we can leave things as-is.
??????????? if (resultCode != RESULT_CANCELED) {
??????????????? loadPrefs();
??????????? }

??????? }
??? }

//獲取(沒有就自動創建)RedirectData.xml文件,并從文件中獲取鍵為text對應的值,( SharedPreferences 文件內的內容都是通過鍵值對的形式存放的),程序第一次加載當然不會有數據,所以返回false。下面我們去看看B中的程序,一會或過頭再來看C。

??? private final boolean loadPrefs() {
??????? SharedPreferences preferences = getSharedPreferences("RedirectData", 0);

??????? mTextPref = preferences.getString("text", null);? //此句表示如果沒有名為text的鍵,則返回null
??????? if (mTextPref != null) {
??????????? TextView text = (TextView)findViewById(R.id.text);
??????????? text.setText(mTextPref);
??????????? return true;
??????? }

??????? return false;
??? }

??? private OnClickListener mClearListener = new OnClickListener() {
??????? public void onClick(View v) {
??????????? // Erase the preferences and exit!
??????????? SharedPreferences preferences = getSharedPreferences("RedirectData", 0);
??????????? preferences.edit().remove("text").commit();
??????????? finish();
??????? }
??? };

??? private OnClickListener mNewListener = new OnClickListener() {
??????? public void onClick(View v) {
??????????? // Retrieve new text preferences.
??????????? Intent intent = new Intent(RedirectMain.this, RedirectGetter.class);
??????????? startActivityForResult(intent, NEW_TEXT_REQUEST);
??????? }
??? };

??? private String mTextPref;
}

?

Activity B:

public class RedirectGetter extends Activity
{
??? @Override
?protected void onCreate(Bundle savedInstanceState)
??? {
??????? super.onCreate(savedInstanceState);

??????? setContentView(R.layout.redirect_getter);

??????? // Watch for button clicks.
??????? Button applyButton = (Button)findViewById(R.id.apply);
??????? applyButton.setOnClickListener(mApplyListener);

??????? // The text being set.
??????? mText = (EditText)findViewById(R.id.text);
??? }

????private OnClickListener mApplyListener = new OnClickListener()
??? {
??????? public void onClick(View v)
??????? {

//當點擊確定按鈕,將文本框內輸入的內容存放到RedirectData.xml文件中,并于鍵text對應,(也就是作為text鍵的值)
??????????? SharedPreferences preferences = getSharedPreferences("RedirectData", 0);
??????????? SharedPreferences.Editor editor = preferences.edit();
??????????? editor.putString("text", mText.getText().toString());

??????????? if (editor.commit()) {
??????????????? setResult(RESULT_OK);? //提交后返回上一個Activity。(由于C到B的跳轉方法是startActivityForResult(intent,requestCode),所以返回到C中執行方法 onActivityResult(int requestCode, int resultCode,Intent data)中相應的語句)
??????????? }

??????????? finish();
??????? }
??? };

??? private String mTextPref;
??? EditText mText;
}

也許沒有圖你看的很郁悶,所以還是自己看看ApiDemo吧。總而言之,原理是:

A通過startAcitivity到C然后直接通過startActvityForResult到B,B中完成操作通過setResult返回到C,在C中通過判斷 SharedPreferences preferences文件中是否有在B中存放的數據,如果有就再C中顯示,并且下次程序運行會直接從A跳轉到C,當在C中清除了B中存放的數據,也就是 SharedPreferences preferences文件中的數據,那么A有恢復到初始狀態,及A跳轉到B。C是中間站,決定了A的下一次跳轉究竟是到B還是C,C也是自由者,他可以在A和B中隨意跳轉。(finish自身及跳轉到A,startActvityForResult方法及跳轉到B)

轉載于:https://www.cnblogs.com/Em-Xu/p/4273263.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277455.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277455.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277455.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度解析數據分析、大數據工程師和數據科學家的區別

數據越來越多的影響并塑造著那些我們每天都要交互的系統。不管是你使用Siri,google搜索,還是瀏覽facebook的好友動態,你都在消費者數據分析的結果。我們賦予了數據如此大的轉變的能力,也難怪近幾年越來越多的數據相關的角色被創造…

python webservice接口測試傳參數_Python3 webservice接口測試方法是什么

Python3 webservice接口測試方法是什么發布時間:2020-06-23 14:07:46來源:億速云閱讀:92作者:清晨不懂Python3 webservice接口測試方法是什么?其實想解決這個問題也不難,下面讓小編帶著大家一起學習怎么去解…

zabbix4.2 系列(二):agent配置

zabbix-agent: 分為主動模式和被動模式,均在配置文件實現(主動模式和被動模式可同時設置): vim /etc/zabbix/zabbix_agentd.conf Server192.168.18.154 (用于被動模式,允許哪臺服務器可以…

java form 對象 一對一_java-雙向一對一地“對象引用了一個未保存...

我有一個簡單的一對一關系:>為每個實體單獨的DAO.>事務由Spring管理.PersonDao personDao ctx.getBean(PersonDao.class, "personDaoImpl");VehicleDao vehicleDao ctx.getBean(VehicleDao.class, "vehicleDaoImpl");Vehicle vehicle …

RabbitMQ 入門教程(PHP版) 第三部分:發布/訂閱(Publish/Subscribe)

發布/訂閱 在上篇第二部分教程中,我們搭建了一個工作隊列。每個任務之分發給一個工作者(worker)。在本篇教程中,我們要做的之前完全不一樣——分發一個消息給多個消費者(consumers)。這種模式被…

Proxmox VE 安裝、配置、使用之第二章 Proxmox VE 的安全性

第一章 Proxmox VE 的安全性一、 角色及權限圖2-1-1二、 Root 的密碼安全性把 Root 的實際密碼給出去, 在任何系統都是不符合安全規范的!所以在 Linux 里面, 最好把有需要 root 權限的使用者 放到 sudoers 的群組.# sudo usermod -a -G sudo testuserPVE 的權限設定方式 是由 u…

java allocate_Java中volatile關鍵字的最全總結

一、簡介volatile是Java提供的一種輕量級的同步機制。Java 語言包含兩種內在的同步機制:同步塊(或方法)和 volatile 變量,相比于synchronized(synchronized通常稱為重量級鎖),volatile更輕量級,因為它不會引起線程上下文的切換和調…

縮放手勢 ScaleGestureDetector 源碼解析,這一篇就夠了

其實在我們日常的編程中,對于縮放手勢的使用并不是很經常,這一手勢主要是用在圖片瀏覽方面,比如下方例子。但是(敲重點),作為 Android 入門的基礎來說,學習 ScaleGestureDetector 的使用&#x…

postgres的數據庫備份和恢復

備份和恢復 一條命令就可以解決很簡單: 這是備份的命令: pg_dump -h 127/0.0.1 -U postgres databasename > databasename.bak 指令解釋: pg_dump 是備份數據庫指令,164.82.233.54是數據庫的ip地址(必須保證數據庫允許外部訪…

java 類的執行順序_Java中類的執行順序

講解在代碼中:package 類執行順序;/*** java類執行順序** 1、如果父類有靜態成員賦值或者靜態初始化塊,執行靜態成員賦值和靜態初始化塊* 2、如果類有靜態成員賦值或者靜態初始化塊,執行靜態成員賦值和靜態初始化塊* 3、將類的成員賦予初值(原…

ZooKeeper相關資料集錦

1、ZooKeeper相關概念總結 https://github.com/Snailclimb/JavaGuide/blob/master/docs/system-design/framework/ZooKeeper.md 2、ZooKeeper在Windows下的安裝和配置 https://blog.csdn.net/morning99/article/details/40426133 3、Curator框架應用 http://ifeve.com/zookeepe…

JQuery.Ajax()的data參數傳遞方式

最近,新學c# mvc,通過ajax post方式傳遞數據到controller。剛開始傳遞參數,controller中總是為null。現記錄一下,可能不全,純粹記個學習日記。 重點在于參數的方式,代碼為例子 1、這里 dataType: "js…

java如何實現封裝_java如何實現封裝

Java中類的封裝是如何實現的封裝是將對象的信息隱藏在對象內部,禁止外部程序直接訪問對象內部的屬性和方法。 java封裝類通過三個步驟實現: (1)修改屬性的可見性,限制訪問。 (2)設置屬性的讀取方法。 (3)在讀取屬性的方法中,添加對…

用了30天整理的一些GO語言學習資料,2019請你加油

因為極其優秀的并發性能,Google的親兒子Go語言站上了風潮之巔。出現在21世紀的GO語言,雖然不能如愿對C取而代之,但是其近C的執行性能和近解析型語言的開發效率以及近乎于完美的編譯速度,已經風靡全球。特別是在云項目中&#xff0…

Kubernetes網絡設計原則

在配置集群網絡插件或者實踐K8S 應用/服務部署請時刻想到這些原則: 1.每個Pod都擁有一個獨立IP地址,Pod內所有容器共享一個網絡命名空間2.集群內所有Pod都在一個直接連通的扁平網絡中,可通過IP直接訪問 所有容器之間無需NAT就可以直接互相訪問…

php token 驗證,PHP如何實現Token驗證

PHP如何實現Token驗證首先將Token進行解析&#xff1b;然后根據解析出來的信息部分驗證是否過期&#xff0c;如果未過期再將解析出的信息部分進行加密&#xff1b;最后將加密出來的數據和解析出來簽名進行比對&#xff0c;如果相同則驗證成功。示例代碼&#xff1a;<?php f…

關于Linux fontconfig 字體庫的坑

01、安裝字體軟件yum -y install fontconfig然后把字體拷過去就行了 cd /usr/share/fonts fc-list 這是查看02、拷貝字體到指定目錄 cp simsun.ttc /usr/share/fonts/然后把字體拷過去就行了 cd /usr/share/fonts 03、驗證字體安裝情況 fc-list //"宋體"中文字體…

滿江紅.互聯網

小小寰球&#xff0c;有多少信息瞬抵。互聯網&#xff0c;幾多濤生&#xff0c;幾多云逸。螞蟻緣槐近大國&#xff0c;菜鳥搭枝成鳳翼。正臺風綠葉下臨安&#xff0c;何足懼?多少事&#xff0c;從來急&#xff1b;天地轉&#xff0c;光陰隙。一百年太久&#xff0c;只爭朝夕。…

Python startswith()函數 與 endswith函數

函數&#xff1a;startswith() 作用&#xff1a;判斷字符串是否以指定字符或子字符串開頭一、函數說明語法&#xff1a;string.startswith(str, beg0,endlen(string)) 或string[beg:end].startswith(str)參數說明&#xff1a;string&#xff1a; 被檢測的字符串str&#xff1a;…

GitLab 在多分支中的一個push

情景&#xff1a;a.本地庫新建的分支&#xff0c;而Git服務器沒有這個分支服務器分支master本地新建分支&#xff1a;rdar-MS&#xff0c;并git checkout rdar-MS上masterrdar-testrdar-MS更改rdar-MS分支上的文件&#xff0c;git add .git commit -m " "后&#xf…