Android_Activity(二)

Android_Activity_Intent
我们写Android程序的时候,一个程序肯定不止一个Activity,肯定会有很多的Activity,如何让这些Activity串联起来呢?那么就需要使用我们今天所说的Intent。

Intent一般可被用于启动活动、启动服务、以及发送广播。在Android中Intent一共分为两种,一个是隐士Intent和显示Intent

使用显示Intent
这里我创建了SecondActivity,它的布局中只是有一个Button。现在就让我们看看点击FirstActivity中的按钮如何跳转到SecondActivity中吧!

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });

隐士Intent
隐士Intent,它并不明确指定出我们想要启动哪一个活动,而是制定了一系列更为冲向的action和category等信息,然后交由系统去分析这个Intent,并帮我们找到合适的活动去启动。
1、在AndroidManifest.xml文件中在相应的Activity中添加Intent-filter属性,并在Intent-filter属性中添加action和category属性。

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

2、在FirstActivity中的按钮的点击事件中添加如下代码:

Button btn = (Button) findViewById(R.id.firstActivity_btnOne);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent("com.example.activitytest.ACTION_START");
                startActivity(intent);
            }
        });

这里只是指定了action的值,并没有指定category的值,因为android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到Intent中。
每一个Intent只能指定一个action,但却能指定多个category
我们可以在AndroidManifest.xml文件中的SecondActivity中添加一个category:

<category android:name="com.example.activitytest.MY_CATEGORY"/>

当我们在FirstActivity中按钮的点击事件中就可以这么写了;

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
Intent("com.example.activitytest.ACTION_START");           intent.addCategory("com.example.activitytest.MY_CATEGORY");
                startActivity(intent);
            }
        });

更多隐士Intent的用法
使用隐士Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这使得Android多个应用程序之间的功能共享成为了可能。
当你的应用程序中需要展示一个网页,这时你没有必要自己去实现一个浏览器,而是只需要调用系统的浏览器来打开这个网页就行了。

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent =new Intent(Intent.ACTION_VIEW);            intent.setData(Uri.parse("http://www.baidu.com"));
                startActivity(intent);
            }
        });

Intent.ACTION_VIEW,这时一个Android系统内置的动作,其常量值为android.intent.action.VIEW。然后通过Uri.parse()方法,将一个网址字符串解析成一个Uri对象,在调用Intent的setData()方法将这个Uri对象传递进去。

以上是通过代码指定Data的数据的,我们还可以在AndroidManifest中指定数据的。这样能够更精确的指定当前活动能够响应什么类型的数据。
data标签中主要可以配置一下内容:
android:scheme
用于指定数据的协议部分,如上例中的http部分。
android:host
用于指定数据的主机部分,如上例中的www.baidu.com
android:port
用于指定数据的端口部分,一般紧随在主机名之后。
android.path
用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
android:mimeType
用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

我新建了一个ThirdActivity,并在AndroidManifest中这样配置这个Activity:

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

这样不仅可以启动Android自带的浏览器,还可以启动我们自己的程序。

调用系统的拨打电话的界面
我在FirstActivity中按钮的点击事件中添加了以下几行代码:

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
    Intent intent =new Intent(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel:10086"));
    startActivity(intent);
  }
});

向下一个活动传递数据
Intent不仅可以启动Activity、Service、Broadcast、而且还可以携带数据传给下一个Activity。
1、在FirstActivity中用Intent传递数据。

btn.setOnClickListener(new View.OnClickListener() {
@Override
   public void onClick(View v) {
     String data="Hello SecondActivity";
     Intent intent =new             Intent(FirstActivity.this,SecondActivity.class);
                intent.putExtra("data",data);
      startActivity(intent);
            }
        });

2、在SecondActivity中接收数据。

Intent intent =getIntent();
String data= intent.getStringExtra("data");
Log.i("SecondActivity",data);

3、打印的Log日志:

06-05 10:13:53.794 26167-26167/com.example.chw.activitytest I/SecondActivity: Hello SecondActivity

返回数据给上一个活动
Activity中有一个startActivityForResult()方法也是用于启动活动的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。
1、在FirstActivity中的按钮的点击事件代码改写成:

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent =new Intent(FirstActivity.this,SecondActivity.class);
                startActivityForResult(intent,1);
            }
        });

2、在SecondActivity中给按钮添加点击事件,当点击按钮的时候,SecondActivity将数据传给FirstActivity:

Button btn2 = (Button) findViewById(R.id.second_Btn2);
        btn2.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                String data="Hello FirstActivity";
                Intent intent =new Intent();
                intent.putExtra("data",data);
                setResult(RESULT_OK,intent);
                //一定要记住写finish()方法
                finish();
            }
        });

3、在FirstActivity中重写onActivityResult()方法:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch(requestCode){
            case 1:
                if (resultCode==RESULT_OK) {
                    String resultData=data.getStringExtra("data");
                    Log.i("FirstActivity",resultData);
                }
                break;
        }
    }

4、我打印的Log日志:

06-05 10:26:28.864 6101-6101/com.example.chw.activitytest I/FirstActivity: Hello FirstActivity

当我们在SecondActivity中没有点击按钮,直接按Back键返回到FirstActivity中的时候,我们也想实现将数据传递给FirstActivity,那么我们就要在SecondActivity中重写onBackPressed()方法

@Override
    public void onBackPressed() {
        String data="Hello FirstActivity";
        Intent intent =new Intent();
        intent.putExtra("data",data);
        setResult(RESULT_OK,intent);
        finish();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值