ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Activity的呼叫转移*(3个Activity之间的跳转)

2019-06-27 09:42:57  阅读:160  来源: 互联网

标签:preferences int text Activity 呼叫转移 Intent 跳转


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)

标签:preferences,int,text,Activity,呼叫转移,Intent,跳转
来源: https://www.cnblogs.com/Em-Xu/p/4273263.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有