Intent学习

这两天在学习Intent,分为显示和隐式,显示是直接跳转到指定Activity,而隐式作用比较多,下面一一介绍。

使用 Intent Filter ,应用程序组件告诉 Android ,它们能为其它程序的组件的动作请求提供服务,包括同一个程序的组件、本地的或第三方的应用程序。
为了注册一个应用程序组件为 Intent 处理者,在组件的 manifest 节点添加一个 intent-filter 标签。在 Intent Filter 节点里使用下面的标签(关联属性),你能指定组件支持的动作、种类和数据。

intent-filter中action与category规则

action动作规则
    <activity android:name="com.x210.intentfilters.OneActivity" android:label="oneActivity">   
        <intent-filter>
            <action android:name="myapp.action.test1" />
            <category android:name="android.intent.category.DEFAULT" />  
        </intent-filter>
    </activity>

规则a.一条intent-filter元素至少应该包含一个action,否则任何Intent请求都不能和该intent-filter匹配。

    <activity android:name="com.x210.intentfilters.OtherActivity" android:label="otherActivity">   
        <intent-filter>  
            <category android:name="cate1"/>
            <category android:name="cate2"/>
            <category android:name="android.intent.category.DEFAULT" />  
        </intent-filter>
    </activity> 

以上intent-filter元素没有包含action标签,任何Intent请求都无法与该intent-filter匹配。

规则b.如果Intent请求的Action和intent-filter中个某一条action匹配,那么该Intent就通过了这条intent-filter的动作测试。

    <activity android:name="com.x210.intentfilters.OneActivity" android:label="oneActivity">   
        <intent-filter>
             <action android:name="myapp.action.test1" />
             <action android:name="myapp.action.test2" />
             <action android:name="myapp.action.test3" />
            <category android:name="android.intent.category.DEFAULT" />  
        </intent-filter>
    </activity> 

以下几种Intent请求都可以通过上述intent-filter的动作测试。
请求1:

Intent intent = new Intent("myapp.action.test1");
startActivity(intent);

请求2:

Intent intent = new Intent("myapp.action.test2");
startActivity(intent);

如果Intent请求或intent-filter中没有说明具体的Action类型,那么会出现下面两种情况。
(1) 如果intent-filter中没有包含任何Action类型,那么无论什么Intent请求都无法和这条intent-filter匹配;
(2) 反之,如果Intent请求中没有设定Action类型,那么只要intent-filter中包含有Action类型,这个Intent请求就将顺利地通过intent-filter的行为测试。

category类别规则
  <activity android:name="com.x210.intentfilters.OtherActivity" android:label="otherActivity">   
            <intent-filter>  
                <action android:name="myapp.action.test1" />
                <category android:name="cate1"/>
                <category android:name="cate2"/>
                <category android:name="android.intent.category.DEFAULT" />  
            </intent-filter>
        </activity>

只有当Intent请求中所有的Category与组件中某一个IntentFilter的category完全匹配时,才会让该 Intent请求通过测试,IntentFilter中多余的category声明并不会导致匹配失败。一个没有指定任何类别测试的 IntentFilter仅仅只会匹配没有设置类别的Intent请求。
以下三种Intent请求都可以通过上述intent-filter的类别测试。

请求1:

Intent intent = new Intent("myapp.action.test1");
intent.addCategory("cate1");
startActivity(intent);

请求2:

Intent intent = new Intent("myapp.action.test1");
intent.addCategory("cate2");
startActivity(intent);

请求3:

    Intent intent = new Intent("myapp.action.test1");
    intent.addCategory("cate1");
    intent.addCategory("cate2");
    startActivity(intent)

Intent传递数据

向下一个活动传递数据

MainActivity.java

    public void login(View view) {
        Intent intent = new Intent(this,LoginActivity.class);
        intent.putExtra("data","dxy");
        startActivity(intent);
    }

LoginActivity.java

   @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_activity);
        Intent intent = getIntent();
        String str = intent.getStringExtra("data");
        Log.d(TAG, "data: " + str);
    }

打印结果如下:

data: dxy

可以传递多种类型数据,传递那种类型,获取时就get那种类型。

返回数据给上一个活动

MainActivity.java

 public void login(View view) {
        Log.d(TAG, "onClick: ");
        Log.d(TAG, "id : " + etId.getText());
        Log.d(TAG, "password : " + etPassword.getText());
        Toast.makeText(this,"登录成功!",Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(this,LoginActivity.class);
        startActivityForResult(intent,1);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        switch (requestCode){
            case 1:
                if(resultCode == RESULT_OK){
                    String returnData = data.getStringExtra("data");
                    Log.d(TAG, "returnData: " + returnData);
                }
        }
    }
}

简介startActivityForResult 方法
startActivityForResult startActivityForResult(Intent intent, int requestCode)。这个方法我一般用来在ActivityA中启动另个activityB。当返回的时候需要携带来自B的数据。ActivityA更新界面。

参数1.就是一个intent 你可以携带一些数据。当然也可以不携带。

参数2.requescode,你自定义的一个int类型的数值(一般>0),当从activityB中返回来的时候。会携带回来。所以你可以用这个参数来判断是从哪个activity中返回的。(前提是你在开启新的activity的时候 要传的requestcode不一样)

 public void onCall(View view) {
        Intent intent = new Intent(Intent.ACTION_DIAL);
        intent.setData(Uri.parse("tel:10086"));
        intent.putExtra("data"," return dxy");
        setResult(RESULT_OK,intent);
        finish();
    }

结果return dxy

Intent中action的各种常见作用

1、Intent.ACTION_MAIN

String: android.intent.action.MAIN

标识Activity为一个程序的开始。比较常用。

Input:nothing

Output:nothing

<activity android:name=".Main" android:label="@string/app_name">   
<intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

</activity> 

2、Intent.Action_CALL

Stirng: android.intent.action.CALL

呼叫指定的电话号码。

Input:电话号码。数据格式为:tel:+phone number

Output:Nothing

Intent intent=new Intent(); 

intent.setAction(Intent.ACTION_CALL);   
intent.setData(Uri.parse("tel:1320010001");
startActivity(intent);

3、Intent.Action.DIAL

String: action.intent.action.DIAL

调用拨号面板


Intent intent=new Intent();

intent.setAction(Intent.ACTION_DIAL);   //android.intent.action.DIAL
intent.setData(Uri.parse("tel:1320010001");

startActivity(intent); 

Input:电话号码。数据格式为:tel:+phone number

Output:Nothing

说明:打开Android的拨号UI。如果没有设置数据,则打开一个空的UI,如果设置数据,action.DIAL则通过调用getData()获取电话号码。

但设置电话号码的数据格式为 tel:+phone number.

4、Intent.Action.ALL_APPS

String: andriod.intent.action.ALL_APPS

列出所有的应用。

Input:Nothing.

Output:Nothing.

5、Intent.ACTION_ANSWER

Stirng:android.intent.action.ANSWER

处理呼入的电话。

Input:Nothing.

Output:Nothing.

6、Intent.ACTION_ATTACH_DATA

String: android.action.ATTCH_DATA

别用于指定一些数据应该附属于一些其他的地方,例如,图片数据应该附属于联系人

Input: Data

Output:nothing

7、Intent.ACTION_BUG_REPORT

String: android.intent.action.BUG_REPORT

显示Dug报告。

Input:nothing

output:nothing

8、Intent.Action_CALL_BUTTON

String: android.action.intent.CALL_BUTTON.

相当于用户按下“拨号”键。经测试显示的是“通话记录”

Input:nothing

Output:nothing

Intent intent = new Intent(Intent.ACTION_CALL_BUTTON);

startActivity(intent);

9、Intent.ACTION_CHOOSER

String: android.intent.action.CHOOSER

显示一个activity选择器,允许用户在进程之前选择他们想要的,与之对应的是Intent.ACTION_GET_CONTENT.

10、Intent.ACTION_GET_CONTENT

String: android.intent.action.GET_CONTENT

允许用户选择特殊种类的数据,并返回(特殊种类的数据:照一张相片或录一段音)

Input: Type

Output:URI


int requestCode = 1001;

Intent intent = new Intent(Intent.ACTION_GET_CONTENT); // "android.intent.action.GET_CONTENT"
intent.setType("image/*"); // 查看类型,如果是其他类型,比如视频则替换成 video/*,或 */*
Intent wrapperIntent = Intent.createChooser(intent, null);

startActivityForResult(wrapperIntent, requestCode);  

11、Intent.ACTION_VIEW

String android.intent.action.VIEW

用于显示用户的数据。

比较通用,会根据用户的数据类型打开相应的Activity。

比如 tel:13400010001打开拨号程序,http://www.g.cn则会打开浏览器等。


Uri uri = Uri.parse("http://www.google.com"); //浏览器 

Uri uri =Uri.parse("tel:1232333"); //拨号程序 
Uri uri=Uri.parse("geo:39.899533,116.036476"); //打开地图定位 
Intent it = new Intent(Intent.ACTION_VIEW,uri); 

startActivity(it); 



//播放视频 

// 获取访问媒体数据库中audio表格的Uri
//Uri mediaUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

//获取访问媒体数据库中video表格的Uri

//Uri videoUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;

Intent intent = new Intent(Intent.ACTION_VIEW); 
Uri uri = Uri.parse("file:///sdcard/media.mp4"); 
intent.setDataAndType(uri, "video/*"); 
startActivity(intent);



//调用发送短信的程序 
Intent it = new Intent(Intent.ACTION_VIEW);
it.putExtra("sms_body", "信息内容..."); 
it.setType("vnd.android-dir/mms-sms"); 
startActivity(it);

12、Intent.ACTION_SENDTO

String: android.intent.action.SENDTO

说明:发送短信息


//发送短信息 

Uri uri = Uri.parse("smsto:13200100001"); 
Intent it = new Intent(Intent.ACTION_SENDTO, uri); 
it.putExtra("sms_body", "信息内容..."); 
startActivity(it); 


//发送彩信,设备会提示选择合适的程序发送 

Uri uri = Uri.parse("content://media/external/images/media/23"); 
//设备中的资源(图像或其他资源) 
Intent intent = new Intent(Intent.ACTION_SEND); 
intent.putExtra("sms_body", "内容"); 
intent.putExtra(Intent.EXTRA_STREAM, uri); 
intent.setType("image/png"); 
startActivity(it);


//Email 

Intent intent=new Intent(Intent.ACTION_SEND); 
String[] tos={"android1@163.com"}; 
String[] ccs={"you@yahoo.com"}; 
intent.putExtra(Intent.EXTRA_EMAIL, tos); 
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_TEXT, "The email body text"); 
intent.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); 
intent.setType("message/rfc822"); 
startActivity(Intent.createChooser(intent, "Choose Email Client"));

13、Intent.ACTION_GET_CONTENT

//选择图片 requestCode 返回的标识
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); //"android.intent.action.GET_CONTENT"
intent.setType(contentType); //查看类型 String IMAGE_UNSPECIFIED = "image/*";
Intent wrapperIntent = Intent.createChooser(intent, null);
((Activity) context).startActivityForResult(wrapperIntent, requestCode);  


//添加音频
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(contentType); //String VIDEO_UNSPECIFIED = "video/*";
Intent wrapperIntent = Intent.createChooser(intent, null);
((Activity) context).startActivityForResult(wrapperIntent, requestCode);  


 //拍摄视频 
int durationLimit = getVideoCaptureDurationLimit(); //SystemProperties.getInt("ro.media.enc.lprof.duration", 60);
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, sizeLimit);
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, durationLimit);
startActivityForResult(intent, REQUEST_CODE_TAKE_VIDEO);


//视频
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(contentType); //String VIDEO_UNSPECIFIED = "video/*";
Intent wrapperIntent = Intent.createChooser(intent, null);
((Activity) context).startActivityForResult(wrapperIntent, requestCode);  


//录音
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(ContentType.AUDIO_AMR); //String AUDIO_AMR = "audio/amr";
intent.setClassName("com.android.soundrecorder",
"com.android.soundrecorder.SoundRecorder");
((Activity) context).startActivityForResult(intent, requestCode);  



//拍照 REQUEST_CODE_TAKE_PICTURE 为返回的标识
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //"android.media.action.IMAGE_CAPTURE";
intent.putExtra(MediaStore.EXTRA_OUTPUT, Mms.ScrapSpace.CONTENT_URI); // output,Uri.parse("content://mms/scrapSpace");
startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE); 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值