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.mzph.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…