Android中intent的使用


intent,顾名思义,是一种目的,不仅可以指明当前组件的目的,也可以传递数据。intent的使用非常广泛,本文只在启动活动方面做一些介绍,如有不对或者补充的地方,欢迎指出。

显式intent跳转Activity

显式intent,即是一种非常明显的目的。由当前Activity跳到指定的Activity。使用的方式为,先构造一个intent,传入当前的Activity与需要跳转到的Activity。然后再启用Intent。

 Intent intent =new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);

当配合Button组件使用时,即按下按钮跳转到另一个Activity

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1=(Button)findViewById(R.id.bu01);
        //buo1为xml界面定义的buttonID
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent =new Intent(MainActivity.this,SecondActivity.class);//SecondActivity为目的Activity
                startActivity(intent);
            }
        });
    }

隐式intent跳转Activity

隐式intent就比较含蓄,它的原理有点类似于相亲,你并不知道你要转到哪个Activity,但是你对心仪的对象有一些小要求,而恰好你相亲的对象能满足你的条件,那么恭喜你,相亲成功(当前Activity也就转到了你相亲对象的Activity)。而我们需要做的,就是给(目标对象)Activity添加响应信息,给(你)原Activity添加响应要求。
怎么做呢,
第一步:咱们先给目标对象添加响应信息吧,具体的是在XML的目标对象下配置一个信息,举例

<activity android:name=".SecondActivity">
        <intent-filter>
            <action android:name="com.example.intent.ACTION_START"/>
            <category android:name="android.intent,category,DEFAULT"/>
        </intent-filter>
        </activity>

我们在SecondActivity内添加了两个信息,一个是action,一个是category,可以简单理解为外貌三观(此处斜眼笑),具体的信息在引号内,随你写。
第二步:咱们给原Activity添加要求

        button1.setOnClickListener(new View.OnClickListener() {/隐式intent
            @Override
            public void onClick(View v) {
               // Intent intent =new Intent(MainActivity.this,SecondActivity.class);
                Intent intent=new Intent("com.example.intent.ACTION_START");//你的具体要求
                startActivity(intent);
            }
        });

然后,你惊奇地发现你的action(外貌)要求与我们最开始写的信息居然完美符合,那恭喜你们配对成功。那可能有人觉得很奇怪,明明只有外貌符合要求,三观(Category)要求都没写,这也能配对?然后细心的你会发现,我们给女方(目标Activity)添加信息时,Category一栏写的是DEFAULT,这个单词是默认的意思,说白点,就是说如果你对她没有特殊的三观要求,她就没有意见,这是嫁鸡随鸡嫁狗随狗的女方,你还要求啥三观呢?
当然如果你对三观有着执着的要求,你大可以在你的要求栏下再添加一行代码比如

intent.addCategory(com,exampel.activity.MY_CATEGORY);

这样的结果就是你可能找不到对象,除非你在女方下也添加相应的信息。

隐式intent打开网页

本来讲完了上述内容我的文章已经写完了,但是,多写点也无妨,因为隐式intent的用法更加广泛,他能与其他程序互通,也能打开网页。

button1.setOnClickListener(new View.OnClickListener() {//显示intent
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse("http:www.baidu.com"));//上述两行为你相亲的要求
                startActivity(intent);
            }
        });

效果图如下

为了更好掌握这点代码的原理,你可以将网页也理解成一个Activity,不同的是,网页的intent-fliter中的action信息为“Intent.ACTION_VIEW”常量,而且在intent-fliter里还配置了另一个信息data,data信息中又包含了sheme(数据协议),host(主机名)等信息。而上述代码

intent.setData(Uri.parse("http:www.baidu.com"));

就是对响应信息的要求。

利用intent传递数据

传递数据分为两种,向下一个Activity传递数据,和将数据返回给上一个Activity.

向下一个Activity传递数据

我们以传递一个字符串为例,咱们要干什么事呢
第一步,将字符串存到一个字符串字符串对象中
第二步:利用显示intent跳转到目的Activity
第三步:给字符串对象找一个键值并传入intent中,
第四步:在目的Activity中获取intent
第五步:获取intent中的键值
第六步:取出键值对应的字符串并打印出来
具体的代码实现
具体实现如下
在当前Acivity中

 button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String data="hi";//第一步
               Intent intent =new Intent(MainActivity.this,SecondActivity.class);//第二步
               intent.putExtra("E",data);//第三步
               startActivity(intent);
            }
        });

在目标Activity中

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

这样是不是很好理解?而其中接触的新函数putExtra()与intent.getStringExtra()的用法也显而易见了。至于为什么要通过键值来传递数据,我怎么知道,它的参数就是这么给的(来自菜鸟的吐槽)
打印出来的日志如下
在这里插入图片描述

将数据返回给上一个活动

intent是启动Activity时传递数据的,那么如果销毁一个Activity时,如何向上一个Activity传递数据呢。
答案是使用Activity里两个自带的函数startActivityForResult()与onActivityResult(),第一个函数是启动另一个Activty的函数并要求一个返回值,而这个返回值就是通过onActivityResult()返回的。
实现效果:A启动B,B销毁并返回一个字符串
具体的实现步骤如下
第一步:利用startActivityForResult()A启动B
第二步:在B里,将字符串赋予键值,并放进intent
第三步:调用SetResult()返回intent
第四步:销毁B
第五步:在A里重写onActivityResult(),因为我们需要把传过来的字符打印出来,让你看到你传递成功了
具体代码如下
A中

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1=(Button)findViewById(R.id.bu01);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) { 
                Intent intent =new Intent(MainActivity.this,SecondActivity.class);
                startActivityForResult(intent,1);//第一步,第二个参数是请求码
            }
        });
    }

A中第五步

 @Override
    protected void onActivityResult(int requestCode,int resultCode,Intent data)//第一个参数式启动活动时传入的请求码,只有请求码配对,才能往下执行。第二个参数是返回数据时的处理结果,第三个参数是data
switch (requestCode){
    case 1:
        if(resultCode==RESULT_OK){
            String returnedData =data.getStringExtra("data_return");
            Log.d("MainActivity",returnedData);
        }
        break;
    default:
}
    }

B中

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        Button button2 = (Button) findViewById(R.id.bu1);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("data_return", "hello");//第二步
                setResult(RESULT_OK, intent);//第三步。第一个参数是返回结果
                finish();第四步
            }
        });
    }

值得注意的是,我在实现的过程中发现当按下B中的按钮,finish()执行了但并不会直接销毁B,还需要再按一下按钮才能销毁并返回intent。(具体的解决方法我也不是很清楚。)
运行之后我们可以在日志中看到
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章