02探究活动-使用Intent在活动中穿梭

显示Intent的使用

  1. 首先再定义一个SecondActivity.java文件,
  public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
    }
}
  1. 在写一个second_layout.xml文件
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <Button
            android:id="@+id/but_2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Button 2"/>
    </LinearLayout>
    
    
  2. 修改FristActivity中的按钮点击事件
        Button but_1 = (Button)findViewById(R.id.but_1);
        but_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(FristActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });
    
    
    • 首先构造了一个Intent,传入FrinstActivity.this作为上下文,然后传入要去的布局,最后通过这个startActivity()方法来执行

隐式Intent用法

  1. 它并不明确的指明想要启动哪一个程序,而是指定更为抽象的action和category等信息,然后交由系统分析这个Intent,并帮我们找到合适的活动去启动
  2. 通过<activity>标签下的<intent-filter>的内容,可以指定当前活动能够响应的action和category,打开这个AndrioidManifest.xml这个文件,进行改写,action标签中指明我们可以响应com.example.activitytest.ACTION_ATART这个action,而category这个标签更加精准的指明了能够响应的Intent还可能带有category,只有这两个标签同时匹配才能响应
     <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="com.example.activitytest.ACTION_ATART"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
    
    
  3. 改变鼠标点击事件,这个时候并没有写这个category这个标签,但是还是能够响应,因为android.intent.category.DEFAULT是一种默认的category,会自动的添加
  Button but_1 = (Button)findViewById(R.id.but_1);
        but_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 这里面是action的值
                Intent intent = new Intent("com.example.activitytest.ACTION_ATART");
                startActivity(intent);
            }
        });

更多隐式Intent的用法

  1. 使用隐式的Intent不仅可以启动自己程序内的活动,还可以启动其他程序的活动,比如想要在程序中显示一个网页,这个时候就只要调用系统的网页就可以了,修改FirstActivity.xml
        Button but_1 = (Button)findViewById(R.id.but_1);
        but_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse("http://www.baidu.com"));
                startActivity(intent);
            }
        });

  • 这里指定的action是Intent.ACTION_VIEW,这是一个内置的,通过这个Uri.parse()方法可以把一个网址解析成一个Uri对象,再通过Intetn的setData方法把这个对象传进去,再startActivity打开,这个时候点击这个按钮,进入的就是百度页面


    2018-03-12_16-45-14.png
  1. 还可以在<intent-filter>标签中再配置一个<data>标签,更加正确的指定当前活动可以响应什么类型的数据,<data>中标签只要可以配置的信息
  • android:scheme 用于指定数据的协议部分,
  • android:host 用于指定数据的主机名
  • androdi:port 用于指定数据的端口部分
  • android:path 用于指定主机名和端口之后的部分
    只有data标签中指定的内容和Intent携带的Data完全一致,当前活动才能够响应该Intetn
    例如:FirstActivity.xml不用动,新建一个ThirdActivity(内容不用动),布局文件third_layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/but_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:text="Button 3"/>
</LinearLayout>

AndroidManifest文件中

<activity android:name=".ThirdActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="http"/>
            </intent-filter>
        </activity>

  • 这个时候我们通过<data android:scheme="http"/>指定了协议必须是http协议,这样ThirdActivity就可以象浏览器一样响应一个打开网页Intent了


    2018-03-12_18-52-25.png

向下一个活动传递数据

  1. 使用的是Intetn提供的putExtra()方法,可以把想要传递的数据暂存起来,然后到下一个活动中取出来就可以了,修改FristActivity中的代码

        Button but_1 = (Button)findViewById(R.id.but_1);
        but_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(FristActivity.this,SecondActivity.class);
                String data = "我是要传递的数据";
                intent.putExtra("data",data);
                startActivity(intent);
            }
        });
  • 点击这个按钮的时候,会到Second的布局中,这个时候调用了intent的putExtra()方法,传入的是键,和值,还是使用的startActivity()的方式来启动
  1. 在SecondActivity中就可以获取到存入的数据了

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        
        Intent intent = getIntent();
        String data = intent.getStringExtra("data");
        Log.d("SecondActivity",data);
    }
}

  • 首先通过getIntent()方法获取到用去启动SecondActivity的Intent,然后调用相应的方法getStringExtra(),传入键就可以了,若传入的是整形,那就使用getIntExtra()方法,查看logcat打印的信息就可以看到了


    2018-03-12_17-55-32.png

返回数据给上一层

  1. 这个时候就必须的使用Activity中的startActivityforResult()方法来启动活动了,这个方法期望在这个活动摧毁的时候可以传递一个数据给上一个活动,这个方法里有两个参数,第一个还是Intent,第二个是请求码,用于在之后的回调中判断数据的来源,修改一下FirstActivity中按钮的点击事件
   Button but_1 = (Button)findViewById(R.id.but_1);
        but_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(FristActivity.this,SecondActivity.class);
                // 这里启动活动的方法变了
                startActivityForResult(intent,1);
            }
        });

  • 这里使用了 startActivityForResult()方法启动活动,请求码必须得唯一
  1. 在SecondActivity中给按钮注册点击事件

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);

        Button but_2 = (Button)findViewById(R.id.but_2);
        but_2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra("data_return","我是向上传递的数据");
                setResult(RESULT_OK,intent);
                finish();
            }
        });
    }
}

  • 首先还是构建了一个Intent,调用Intent的putExtra()方法存入数据,
  • 然后调用了setResult()方法,这个方法非常重要,用于向上返回数据,第一个参数是用于向上一个活动返回处理结果集,一般就只有RESULT_OK或者RESULT_CANCELED这两个参数,第二个参数是把带有数据的intent返回
  • 最后调用finish()方法销毁当前的活动
  1. 由于是使用startActivityForResult()方法启动SecondActivity,那么在SecondActivity销毁的之后就会回调上一个活动的onActivityResult()方法,所以在FristActivity中重写这个方法
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode){
            case 1:
                if(resultCode == RESULT_OK){
                    String returnData = data.getStringExtra("data_return");
                    Log.d("FristActivity",returnData);
                }
                break;
            default:
        }
    }

  • 第一个参数就是在启动活动的时候传入的请求码(唯一)
  • 第二个参数是返回数据的时候传入的处理结果
  • 第三个参数是携带数据的intent


    2018-03-12_18-29-51.png
  1. 这个时候如果没有在SecondActivity界面点击按钮,而是直接使用Back键返回的,这样的话数据就返不回来了,所以在SecondActivity中重写这个onBackPressed()
  @Override
    public void onBackPressed() {
        Intent intent = new Intent();
        intent.putExtra("data_return","我是通过返回键向上传递的数据");
        setResult(RESULT_OK,intent);
        finish();
    }

  • 当按到Back键的时候,就会执行这个方法onBackPressed()


    2018-03-12_18-35-38.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容

  • Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重要。 一、什么是Intent...
    困惑困惑困惑阅读 1,506评论 0 0
  • 一个应用中总会存在多个活动,通过这些活动的相互跳转,数据传递,逻辑处理,便可完成一个应用的功能。在各个活动的跳转时...
    吸给007阅读 548评论 0 2
  • 1.活动(Activity) Activity是一种可以包含用户界面的组件,主要用于和用户进行交互。手动创建活动,...
    努力生活的西鱼阅读 725评论 0 0
  • 作为Android的四大组件之一,活动最先走进我们的视野,其重要性不言而喻,今天就抽出时间来专门对Android活...
    loser先生阅读 869评论 0 0
  • Android 的活动是可以包含用户界面的组件,主要用于与用户进行交互。 1 手动创建活动 手动创建活动可以加深对...
    deniro阅读 3,625评论 0 10