安卓学习(初)第二章(2)(《第一行代码》)

一、用Intent启动活动

1、Intent()函数需要两个参数,第一个参数要求提供一个启动活动的上下文,第二个参数是指定想要启动哪个目标活动

2、示例:

 public void onClick(View v){
    Intent intent=new Intent(FirstActivity.this,secondActivity.class);
    startActivity(intent);
}

3、意义(意图):在一个活动的基础上打开另一个新活动。startActivity(intent);是启动目标活动的方法。

4、隐式Inttent()示例:

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

表示同时匹配到category和action时可以响应这个活动

点击事件:

 public void onClick(View v){
    Intent intent=new Intent("com.example.activitytest.ACTION_STSRT");
    startActivity(intent);
}

这里Intent()只指定了action一样能响应到secondactivity,因为没指定category就是自动默认为"android.intent.category.DEFAULT"

如此secondactivity的action和category都被匹配到了,就能响应该活动,而成功选择这个活动启动。

5、隐式Intent中只能指定一个action,但你却能指定多个category,比如:

 public void onClick(View v){
    Intent intent=new Intent("com.example.activitytest.ACTION_STSRT");
    intent.addCategory("com.example.activitytest.MY_CATEGORY");           //这里就除了默认的还添加多了一个category
    startActivity(intent);
}

相应的,注册活动时category也可以设置多个,且没在注册中出现的category在活动代码中出现,项目运行会报错!!!

二、更多Intent隐式用法

1、用于更精确地指定当前活动能够响应什么类型的数据<data>,如在<intent-filter>中添加<data>标签:

<data android:scheme="      "/>             //指定数据协议部分,如http。

<data android:host="      "/>                   //指定数据协议部分,如www.baidu.com。

<data android:port="      "/>                    //指定数据的端口部分,一般在主机名之后。

<data android:path="      "/>                    //指定主机名和端口之后的部分,如一段网址跟着域名之后的内容。

<data android:mimeType="      "/>          //用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

2、示例:

<activity android:name=".ThirdActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />             //能够响应的action是ACTION_VIEW
        <category android:name="android.intent.category.DEFAULT" />      //category保持默认
        <data android:scheme="http"/>                                    //指定数据协议是http
    </intent-filter>
</activity>

将在下面这个活动响应:

public void onClick(View v){
    Intent intent=new Intent(Intent.ACTION_VIEW);          //Intent.ACTION_VIEW是Android系统的内置动作匹配action
    intent.setData(Uri.parse("http://www.baidu.com"));     //匹配data
    startActivity(intent);                                 //启动活动
}

当执行了这个程序,就会弹出所有能够响应这个Intent的所有应用程序供用户选择打开。

3、协议指定。http表示网址,geo表示地理位置,tel表示电话,如:

intent.setData(Uri.parse("tel:10086"));

三、向下一个活动传入数据

1、Intent还可以在启动活动的时候传递数据,如要把一个字符串从活动一传入活动二

2、示例:

 public void onClick(View v){
    String data="Hello SecondActivity";                                  //设置需要传入的数据(这里是一个字符串)
    Intent intent=new Intent(FirstActivity.this,SecondActivity.class);   //用显式Intent启动SecondActivity
    intent.putExtra("extra_data",data);                                  //用putExtra函数传入字符
    startActivity(intent);
}

注:传入putExtra函数内的两个参数,第一个参数是键,用于后面从Intent取值,第二个参数是传入的数据。

如此传入数据后,在被传入数据的活动可以这样

Intent intent=getIntent();                                       // 获得在该活动的Intent

String data=intent.getStringExtra("extra_data");

直接获取数据

四、向上一个活动返回数据

1、startActivityForResult()也是用于启动活动的方法,比startActivity()方法多一个返回结果的功能。startActivityForResult()方法有两个参数,第一个参数还是intent,第二个参数是请求码(只要是唯一值就行)。

2、专门用于向上一个活动返回数据的方法setResult(),这个函数需两个参数,第一个参数是用于向上一个活动返回处理结果(一般只使用RESULT_OK或RESULT_CANCEL),第二个参数把有数据的intent传递回去。

3、示例:

public void onClick(View v) {
    Intent intent = new Intent(FirstActivity.this,secondActivity.class);
    startActivityForResult(intent,1);
}                                                             //在FirstActivity的class中添加

先在FirstActivity打开secondActivity,并使用startActivityForResult()可返回会数据的启动活动方法。

Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       Intent intent = new Intent();
       intent.putExtra("data_return","Hello FirstActivity");//传入的数据是"Hello FirstActivity",data_return代之
       setResult(RESULT_OK,intent);
       finish();
    }
});                                                         //在secondActivity的class中添加

这段代码创建了button2 的按键反应,打开secondActivity时按下button2,intent通过putExtra方法加载数据,setResult方法再用已有数据的intent返回上一个活动数据。最后销毁当前活动回到上一个活动。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
switch(requestCode){
    case 1:
    if (resultCode == RESULT_OK) {
        String returnedData = data.getStringExtra("data_return");    //给returnedData创建实例
        Log.d("FirstActivity", returnedData);                          data_return就是代指Hello FirstActivity
       }
        break;
    default:
 }
}                                                                    //FirstActivity的class中添加

在secondActivity销毁后会回调到FirstActivity活动的onActivityResult方法,这里面有三个参数其中requestCode是  startActivityForResult方法中的请求码, resultCode就是setResult方法中的处理结果, Intent data即是intent携带的返回数据

4、通过back键返回数据

示例:

@Override
public void onBackPressed(){
    Intent intent=new Intent();
    intent.putExtra("data_return","Hello FirstActivity");
    setResult(RESULT_OK,intent);
    finish();
}                                                           //在secondActivity的class中添加

向上一个活动返回数据方法和用startActivityForResult()方法向上一个活动活动返回数据类似

猜你喜欢

转载自blog.csdn.net/Entronk_star/article/details/81436179