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

Activity的呼叫转移*(3个Activity之间的跳转)相关推荐

  1. android 如何获得activity的view对象,Android的Activity 、 Window 、 View之间的关系

    什么是Activity .View . Window? Activity:是Android 四大组件之一, 是存放View对象的容器,也是我们界面的载体,可以用来展示一个界面.它有一个SetConte ...

  2. 安卓开发之如何利用Intent对象,实现Activity和另一个Activity之间的跳转

    1.在一个安卓项目中,如果仅有一个Activity,直接在AndroidManifest.xml配置文件中进行配置,如果有两个Activity,要实现直接的跳转,则需要调用Intent对象,其中主要的 ...

  3. Activity之间的跳转和四种启动模式

    一.Activity的基础知识 1.每一个创建好的Activity都需要在manifests文件中进行注册. 这里就注册了2个activity! 2.打开app的时候会首先进入有intent-filt ...

  4. Activity与Fragment,以及Fragment与Fragment之间的数据通讯

    Activity和Fragment无疑是Android开发中使用最多的组件,如果Activity使用了多个Fragment,需要在Activity与Fragment,以及Fragment与Fragme ...

  5. Activity、Window、DecorView、ViewRootImpl之间的关系

    我们通常写Activity的时候在onCreate里面都会写上setContentView()这一步,该方法会将你指定的布局文件加载并显示到屏幕中,在其中会经历一系列操作,其中也就涉及到了Activi ...

  6. 同一个 Activity 中 fragment 之间的跳转处理

    这里我们有两种方法: 方法一: 直接在 Fragment 中获取托管它的 activity 中的 FragmentManager,然后直接提交事务进行替换: // AFragment.java (这里 ...

  7. 四.Activity的启动流程-ActivityThread启动Activity的过程

    Activity的启动一般分为普通Activity的启动,根Activity的启动.而根Activity是指应用启动的第一个Activity过程,所以也可以理解为应用的启动过程. 相关内容链接:and ...

  8. 爱情呼叫转移-深度广度遍历(中)

    广度遍历和深度遍历可以结合吗? 可以的,例如经典的<爱情转移> <爱情转移>是电影<爱情呼叫转移>的主题曲,<爱情呼叫转移>讲述了一个男人穿梭在12个女 ...

  9. 爱情呼叫转移-深度广度遍历合集

    1.这件事是特殊的,还是普遍的? 工作中常常会遇到各种各样的问题,不管黑猫白猫,抓到老鼠就是好猫.哪只猫好,往往需要对比分析. 如何做数据对比,需要加入哪些数据来分析,在哪里进行数据对比,例如频率.功 ...

最新文章

  1. window 下Eclipse c++的开发环境配置
  2. c语言字面值知识体系总结大学霸IT达人
  3. 剑指offer:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
  4. 5、leetcode剑指offer53 二分查找之0~n-1缺失的数字**
  5. 互联网公司忽悠员工的黑话
  6. Vue源码后记-更多options参数(1)
  7. django09: ORM以及CSRF(旧笔记)
  8. insight切换窗口 source_source insight的使用方法逆天整理(1)
  9. js 点击侧边栏展示内容_上海SEO优化网站侧边栏一般添加什么内容
  10. Socket网络编程【获取本机IP】
  11. emmet语法 1127
  12. mysql 表自动复制_mysql-10临时表、复制表
  13. 来自未来的缓存 Caffeine,带你揭开它的神秘面纱
  14. C++类中的main函数
  15. 赫尔默特方差分量估计Python
  16. Atitit.现在的常用gui技术与gui技术趋势评价总结
  17. 基于M6097 switch的STP协议调试方法
  18. 女诗经,男楚辞
  19. 2017.3.15读完《围城》
  20. linux运行vb程序,Linux可执行文件ELF结构及程序加载运行

热门文章

  1. proguard android 配置,android – Proguard忽略库的配置文件
  2. java 独占锁_锁分类(独占锁、分拆锁、分离锁、分布式锁)
  3. c语言16进制按10进制输出,C语言编程:写一个函数,输入一个16进制数,输出相应的10进制数。...
  4. 离线安装宝塔lnmp_宝塔LNMP环境 Nginx安装EduSoho教程说明
  5. 重新加一个window_Activity、View、Window关系,进程间通信,责任链模式,Https,数据存储...
  6. 说一下 runnable 和 callable 有什么区别?
  7. SpringCloud和SprigBoot之间的依赖关系怎么看
  8. 电脑软件:5个实用的Windows软件,大幅度提高你的工作效率!
  9. 盘点那些面试中最常问的MySQL问题
  10. STM32 PWM输出实验