Android之Intent深入

Android中的意图包含多种用法,本文主要包括以下内容

  1. 显式意图
  2. 隐匿意图
  3. 要求结果回传的意图

显式意图 :必须指定要激活的组件的完整包名和类名 (应用程序之间耦合在一起)
一般激活自己应用的组件的时候 采用显示意图

隐式意图: 只需要指定要动作和数据就可以 ( 好处应用程序之间没有耦合)
激活别人写的应用 隐式意图, 不需要关心对方的包名和类名

显式意图

//意图     开电视  打人  打酱油
        Intent intent = new Intent(this, CalcActivity.class);
        intent.putExtra("name", name);
        //显式意图
        //intent.setClassName(getPackageName(), "com.itheima.rpcalc.CalcActivity");//不指定动作,也不指定数据 直接指定要激活的组件
        startActivity(intent);

显式意图接收

public class CalcActivity extends Activity {
    private TextView tv_result;

    //当activity被创建的时候调用的方法
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calc);
        tv_result = (TextView) findViewById(R.id.tv_result);
        Intent intent = getIntent();
        String name = intent.getStringExtra("name");
        byte[] result = name.getBytes();
        int number = 0;
        for(byte b :result){
             number += b&0xff;
        }
        int sorce = Math.abs(number)%100;
        tv_result.setText(name+"的人品:"+sorce);
    }
}

隐式意图

隐式意图只要设置action与data即可

要实现隐式意图,首先要在Manifest文件中配置action,category,mimetype等

<activity android:name="com.itheima.intent2.SecondActivity" >
            <intent-filter>
                <action android:name="com.itheima.intent2.open2" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="application/person" />
                <data android:scheme="jianren" />
            </intent-filter>

        </activity>

隐式意图的实现

public void click(View view) {
        // 打 action
        // 人 数据
        // 附件的数据 Category 类别
        Intent intent = new Intent();
        intent.setAction("com.itheima.intent2.open2");
        intent.addCategory(Intent.CATEGORY_DEFAULT);

        // URL:统一资源定位符 http https ftp rtsp: URI:统一资源标识符 url是uri的一个子集
        // intent.setData(Uri.parse("jianren:张三"));  setData与setType是对立的,不能同时使用,同时使用时要用setDataAndType
        // intent.setType("application/person");
        intent.setDataAndType(Uri.parse("jianren:张三"), "application/person");
        startActivity(intent);
    }

使用隐式意图打开浏览器的一个例子

浏览器的属性配置如下

<intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="http" />
                <data android:scheme="https" />
                <data android:scheme="inline" />
                <data android:mimeType="text/html"/>
                <data android:mimeType="text/plain"/>
                <data android:mimeType="application/xhtml+xml"/>
                <data android:mimeType="application/vnd.wap.xhtml+xml"/>
            </intent-filter>

利用隐式意图实现

    public void click(View view){
//        <action android:name="android.intent.action.VIEW" />
//        <category android:name="android.intent.category.DEFAULT" />
//        <category android:name="android.intent.category.BROWSABLE" />
//        <data android:scheme="http" />
//        <data android:scheme="https" />
//        <data android:scheme="about" />
//        <data android:scheme="javascript" />
        Intent intent = new Intent();
        intent.setAction("android.intent.action.VIEW");
        intent.addCategory("android.intent.category.DEFAULT");
        intent.addCategory("android.intent.category.BROWSABLE");
        intent.setData(Uri.parse("http://www.baidu.com"));
        startActivity(intent);
    }

得到返回值的Intent实现,短信助手实例

public class MainActivity extends Activity {
    private EditText et_content;
    private EditText et_number;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_content = (EditText) findViewById(R.id.et_content);
        et_number = (EditText) findViewById(R.id.et_number);
    }

    public void selectSms(View view) {
        Intent intent = new Intent(this, ListSmsActivity.class);
        // 开启一个新的界面,并且获取界面的返回值
        // startActivity(intent);
        // int requestCode 请求码
        startActivityForResult(intent, 0);
    }

    public void selectNumber(View view) {
        Intent intent = new Intent(this, ListNumberActivity.class);
        // 开启一个新的界面,并且获取界面的返回值
        // startActivity(intent);
        // int requestCode 请求码
        startActivityForResult(intent, 1);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (data != null) {
            String smsinfo = data.getStringExtra("smsinfo");
            if (resultCode == 0) {
                et_content.setText(smsinfo);
            } else if (resultCode == 1) {
                et_number.setText(smsinfo);
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }


    public void sendSms(View view){
        String content = et_content.getText().toString().trim();
        String number = et_number.getText().toString().trim();
        SmsManager.getDefault().sendTextMessage(number, null, content, null, null);
        Toast.makeText(this, "发送成功", 0).show();
    }
}

编辑短信

public class ListSmsActivity extends Activity {
    private ListView lv;
    private String[] objects = {
            "玫瑰香香,情人黏黏,情话甜甜,情歌绵绵;花灯灿灿,礼花点点,好运连连,好梦圆圆。情人节喜逢元宵节,喜鹊登枝蝴蝶成双鸳鸯成对双喜临门祝双节快乐,合家团团圆圆,甜甜蜜蜜,开开心心,幸幸福福",
            "情人节快到了,我精心挑选玫瑰花、百合花和满天星,扎成一束鲜花随短信送给你,火红的玫瑰代表热烈奔放,洁白的百合代表百年好合,小小的满天星代表幸福美好。愿你的情人节热烈奔放,你们的爱情百年好合,你们的生活幸福美满。预祝情人节快乐",
            "^o^满天星光,最爱你许过愿望的那一颗,鲜花绽放,最爱你摘下微笑的那一朵,曼妙旋律,最爱你感动落泪的那一段,亲爱的,情人节快乐,爱你。 ",
            "^o^宝贝,情人节到了,送你一束玫瑰,用真心塑料纸包扎,系上快乐彩带,喷点爱的香水,插一张真情卡片,写着:宝贝,愿我的爱能带给你一生的快乐!" };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sms);
        lv = (ListView) findViewById(R.id.lv);
        lv.setAdapter(new ArrayAdapter<String>(this, R.layout.sms_item,
                R.id.tv_info, objects));

        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                String smsinfo = objects[position];
                Intent data = new Intent();
                data.putExtra("smsinfo", smsinfo);
                //设置数据。
                setResult(0, data);
                //关闭掉当前的activity,并且回传数据 onActivityResult().
                finish();
            }
        });
    }
}

选择联系人

public class ListNumberActivity extends Activity {
    private ListView lv;
    private String[] objects = {
            "1234","34324","5643543","32424" };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sms);
        lv = (ListView) findViewById(R.id.lv);
        lv.setAdapter(new ArrayAdapter<String>(this, R.layout.sms_item,
                R.id.tv_info, objects));

        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                String smsinfo = objects[position];
                Intent data = new Intent();
                data.putExtra("smsinfo", smsinfo);
                //设置数据。
                setResult(1, data);
                //关闭掉当前的activity,并且回传数据 onActivityResult().
                finish();
            }
        });
    }
}

完成

原文地址:https://www.cnblogs.com/jjx2013/p/6223717.html