AKever

导航

Android(1)-显式Intent和隐式Intent && startActivityForResult

参考:http://blog.sina.com.cn/s/blog_a130052501017ft5.html

1. Intent

Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,
Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递 Intent 来执行动作和产生事件。
使用 Intent 可以激活 Android 应用的三个核心组件:活动(Activity)、服务(Service)和广播接收器(BroadcastReceiver)。

2.显式Intent直接用组件的名称定义目标组件,这种方式很直接,更多用于在应用程序内部传递消息。

  调用Intent.setComponent() 或 Intent.setClassName() 或 Intent.setClass()方法明确指定了组件名,或参考一下实例,明确指定了Intent应该传递给哪个组件。

3.隐式Intent恰恰相反,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息

  Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(data: URI和数据类型)找到最合适的组件来处理这个意图。

  ·例如拨打电话的意图:
   Uri uri = Uri.parse("tel:" + phoneCode);
   Intent intent = new Intent(Intent.ACTION_CALL, uri);

 ·对于隐式意图,Android是怎样寻找到这个最合适的组件呢?(参考以下示例)

   ·在AndroidManifest.xml定义活动(Activity)时,指定了一个intent-filter,Intent Filter(意图过滤器)其实就是用来匹配隐式Intent的,当一个意图对象被一个意图过滤器进行匹配测试时,只有三个方面会被参考到:动作、数据(URI以及数据类型)和类别。

MainActivity.class跳转至SecondActivity.class(示例)

一.显式Intent

//显示方式声明Intent,直接启动SecondActivity
Intent it = new Intent(MainActivity.this,SecondActivity.class); //启动Activity startActivity(it);

二.隐式Intent

Intent intent = new Intent(SecondActivity.this,“com.st.org.main”);
//启动Activity
startActivity(intent);

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.android.test.activity"
  android:versionCode="1"
  android:versionName="1.0">
  <uses-sdk android:minSdkVersion="10" />

  <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".MainActivity"
      android:label="@string/app_name">
      <intent-filter>  
        <action android:name="com.st.org.main" />  <!-- 标志 -->
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity android:name=".SecondActivity"
      android:label="@string/app_name">
    </activity>
  </application>
</manifest>

 其他隐式Intent

1.拨打电话的意图:
     Uri uri = Uri.parse("tel:" + phoneCode);
     Intent intent = new Intent(Intent.ACTION_CALL, uri);
  或
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_CALL);
    Uri uri = Uri.parse("tel:"+number);
    intent.setData(uri);
    startActivity(intent);

2.返回桌面:
   Intent intent = new Intent();
   intent.setAction(Intent.ACTION_MAIN);
   intent.addCategory(Intent.CATEGORY_HOME);
   this.startActivity(intent);

3.调用系统的浏览器,浏览指定网页
  String number = et.getText().toString();
  Intent intent = new Intent();
  intent.setAction(Intent.ACTION_CALL);
  Uri uri = Uri.parse("tel:"+number);
  intent.setData(uri);
  startActivity(intent);

4.调用系统联系人程序,编辑id为1的联系人
  Intent intent = new Intent();
  intent.setAction(Intent.ACTION_EDIT);
  intent.setData(Uri.parse("content://com.android.contacts/contacts/1"));
  this.startActivity(intent);

 

三.启动新的Activity并获取新Activity的返回值 

    转自:http://blog.csdn.net/conowen/article/details/7292246#

  如果需要取得返回值,不再调用startActivity(),而是调用startActivityForResult();
  例如activity A跳转到activity B
  1.public void startActivityForResult (Intent intent, int requestCode);
    首先startActivityForResult 有两个参数,第一个为当前activity的intent(假设为activity A),至于第二个参数的用法,还是先看一下官方SDK文档的解释(requestCode: If >= 0, this code will be returned in onActivityResult() when the activity exits.).requestCode一般都是设置大于或者等于0,因为activity A可能不单单要跳转到activity B,也可能跳转到activity C,D,E……,这些activity返回来的数据都交由activity处理,那activity又通过什么来分辨返回来的数据到底是哪个activity回来的呢。所以在activity A跳转到某一个activity时,要设定目标activity的requestCode,这个requestCode就唯一地标识了相对应的activity。
如下所示,当要跳转到activity B时,15表示是activity B的标识。

IntentActivity.this.startActivityForResult(intent, 15);

  然后activity A通过复写onActivityResult方法来处理这些activity返回来的数据。onActivityResult定义如下:

@Override
protected void onActivityResult (int requestCode, int resultCode, Intent data) 

  数据处理方法onActivityResult()有三个参数:

  第一个requestCode是用来区分哪个activity回来的数据,可以通过swith语句来筛选。
  第二个参数为resultCode,也是一个int类型,如果activity B有几种不同返回的结果,同样地可以通过resultCode来筛选。当跳转到其他activity时,如activity B。需要知道的是,把activity B的数据返回去给activity A的处理方法是setResult (int resultCode, Intent data),可以看到它的第一个参数是resultCode,也就是对应着相应的处理方式,官方的推荐取值如下,这些是宏变量,实质是int。当然也可以自定义为数值,自己习惯就行了。

RESULT_CANCELED
RESULT_OK
RESULT_FIRST_USER

  第三个参数为Intent data,为activity返回来的数值,如通过data.getStringExtra("key");就可以取出来。
另外,如果activity A只需要跳转到activity B而已,那跳转时,request code只要大于或者等于0就行,而数据处理的方法onActivityResult()如下结构就行了,不用筛选request code。

switch (resultCode) {
    case 0:
       //do something
        break;
    case 1:
        //do something
        break;
    default:
        break;
}     

完整代码示例:

//IntentActivity为第一个activity

package conowen.Activity.intent;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class IntentActivity extends Activity {

    /** Called when the Activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button bt = (Button) findViewById(R.id.bt);
        Button bt2 = (Button) findViewById(R.id.bt13);

        bt.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(IntentActivity.this,
                        secondactivity.class);
                // 将intent绑定到第二个activity,然后开始跳转到第二个Activity
                IntentActivity.this.startActivityForResult(intent, 15);
                // 第二个参数为requestCode,大于或等于0,

            }
        });

        bt2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(IntentActivity.this,
                        requestCodetest.class);//将intent绑定在第三个activity
                IntentActivity.this.startActivityForResult(intent, 25);

            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {// 通过requestCode来辨别数据来自哪个activity
        case 15:// 取得来自Activity2的数据,并显示于画面上
            switch (resultCode) {// 通过resultCode来辨别activity的相应处理方法

            case 0:

                String resultstr1 = data.getStringExtra("result");// 取出传回来的数据
                TextView tv = (TextView) findViewById(R.id.tv);
                tv.setText(resultstr1);// 显示出来

                break;
            case 1:

                String resultstr2 = data.getStringExtra("result");
                TextView tv1 = (TextView) findViewById(R.id.tv);
                tv1.setText(resultstr2);
                Toast.makeText(this,
                        "第2个activity的requestCode的值为" + requestCode,
                        Toast.LENGTH_LONG).show();

                break;
            default:
                break;
            }
            break;
        case 25:
            switch (resultCode) {
            case RESULT_OK:

                String resultstr3 = data.getStringExtra("result3");
                Toast.makeText(this,
                        "第3个activity的requestCode的值为" + requestCode,
                        Toast.LENGTH_LONG).show();
                TextView tv = (TextView) findViewById(R.id.tv);
                tv.setText(resultstr3);

                break;
            default:
                break;
            }
        default:
            break;

        }

    }
}
//secondactivity为第二个activity
package conowen.Activity.intent;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class secondactivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.secondactivity);

        // 获取启动这个activity的intent
        Button returnbt1 = (Button) findViewById(R.id.returnbt1);
        final Intent intent = getIntent();
        returnbt1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                EditText et = (EditText) findViewById(R.id.et);
                String res = et.getText().toString();
                intent.putExtra("result", res);// 把数据塞入intent里面
                secondactivity.this.setResult(0, intent);// 跳转回原来的activity
                secondactivity.this.finish();// 一定要结束当前activity

            }
        });
        Button returnbt2 = (Button) findViewById(R.id.returnbt2);
        returnbt2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                intent.putExtra("result", "验证result code");
                secondactivity.this.setResult(1, intent);
                secondactivity.this.finish();
            }
        });

    }

}
//requestCodetest是第三个activity

package conowen.Activity.intent;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class requestCodetest extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.requestcode);// layout的xml文件名不能为大写字母

        Button bt3 = (Button) findViewById(R.id.returnbt3);

        bt3.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // 这个activity主要是为了验证requestCode
                EditText et3 = (EditText) findViewById(R.id.et3);
                Intent intent = getIntent();// 获取启动这个activity的intent
                String res = et3.getText().toString();
                intent.putExtra("result3", res);
                requestCodetest.this.setResult(RESULT_OK, intent);
                requestCodetest.this.finish();

            }
        });

    }

}

 

 

posted on 2013-12-13 09:54  AKever  阅读(641)  评论(0)    收藏  举报