盒子
盒子
文章目录
  1. IntentFilter的匹配
  2. Intent使用集合
    1. 打开网页
    2. 拨打电话
    3. 发送短信
    4. 发送邮件
    5. 播放音频
  3. PendingIntent

Android中的意图

IntentFilter的匹配

  • action
  • catogory
  • data
  • data由mimeTypeURI组成

  • mineType
  • 1
    <data android:mimeType="image/*"/>
    1
    intent.setDataAndType(uri,"image/png");

  • URI
  • 1
    <scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]

    eg:

    content://io.github.grooters.lller:200/folder/subfolder/etc

    Path和pathPattern均表示完整的路径,但pathPattern可使用通配符“*”(表示0个或多个任意字符),pathPrefix表示路径的前缀信息

    注意:

    1
    * = >\\* , \ => \\\\

  • 注意
  • 当通过隐式方式启动activity时需要将activity的category设置为“android.intent.category.DEFAULT”

    eg:

    1
    2
    3
    4
    5
    6
    <activity android:name=".DownloadActivity">
    <intent-filter>
    <action android:name="activity"/>
    <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
    </activity>



    1
    2
    3
    Intent intent=new Intent("activity");
    intent.addCategory("android.intent.category.DEFAULT");
    startActivity(intent);

    为了确保启动的式自己的服务自从Android 5.0后已经不支持隐式启动组件了,若需要隐式启动可通过以下方式:

    方法1:

    1
    2
    3
    4
    Intent mIntent = new Intent();
    mIntent.setAction("");
    mIntent.setPackage(getPackageName());
    context.startService(mIntent);

    方法2:

    1
    2
    3
    4
    Intent intent = new Intent();
    ComponentName componentName = new ComponentName(pkgName,serviceName);
    intent.setComponent(componentName);
    context.startService(intent);

    Intent使用集合

    打开网页

    1
    2
    3
    Uri uri = Uri.parse("https://www.baidu.com");
    Intent it = new Intent(Intent.ACTION_VIEW,uri);
    startActivity(it);

    拨打电话

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Uri uri = Uri.parse("tel:10086");  
    Intent it = new Intent(Intent.ACTION_DIAL, uri);
    startActivity(it);

    Uri uri = Uri.parse("tel.10086");
    Intent it =new Intent(Intent.ACTION_CALL,uri);
    startActivity(it);
    //需要动态权限
    <uses-permission android:name="android.permission.CALL_PHONE" />

    发送短信

    1
    2
    3
    4
    Uri uri = Uri.parse("smsto:10086");     
    Intent it = new Intent(Intent.ACTION_SENDTO, uri);
    it.putExtra("sms_body", "cwj");
    startActivity(it);

    发送邮件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Uri uri = Uri.parse("lilinlang@hotmail.com");  
    Intent it = new Intent(Intent.ACTION_SENDTO, uri);
    startActivity(it);

    Intent it = new Intent(Intent.ACTION_SEND);
    it.putExtra(Intent.EXTRA_EMAIL, "lilinlang@hotmail.com");
    it.putExtra(Intent.EXTRA_TEXT, "The email body text");
    it.setType("text/plain");
    startActivity(Intent.createChooser(it, "Choose Email Client"));

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

    播放音频

    1
    2
    3
    4
    5
    6
    7
    Intent it = new Intent(Intent.ACTION_VIEW);  
    Uri uri = Uri.parse("file://sdcard/lll.mp3");
    it.setDataAndType(uri, "audio/mp3");

    Uri uri = Uri.parse("file://sdcard/lll.mp4");
    it.setDataAndType(uri, "video/mp4");
    startActivity(it);

    PendingIntent

    通过以下三个方法创建实例对象:

    1. getActivity
    2. getService
    3. getBroadcast

    以上三个方法均有4个参数:

  • Context context
  • int requestCode
  • 表示PendingIntent发送方的请求码,通常设为0,也可以作为判断两个PendingIntent是否匹配的条件

  • Intent intent
  • int flag
  • 有以下三种取值:

    1. FLAG_ONE_SHOT

      PendingIntent只能使用一次,使用完好便会被cancle,之后相同的PendingIntent无法再次被使用

    2. FLAG_NO_CREATE

      当前描述的PendingIntent不主动创建,若当前PendingIntent不存在则getActivity返回null

    3. FLAG_CANCEL_CURRENT

      当前描述的PendingIntent若已经存在,则会先cancle掉已存在的PendingIntent,然后重新创建

    4. FLAG_UPDATE_CURRENT

      当前描述的PendingIntent若已经存在,则会更新该PendingIntent,即将更新Intent的Extras

    当PendingIntent的IntentrequestCode一致时则说明它们匹配

    example:

    1
    2
    PendingIntent pendingIntent=PendingIntent.getActivity(this,0,new Intent(this,TestActivity.class),PendingIntent.FLAG_UPDATE_CURRENT);
    remoteViews.setOnClickPendingIntent(R.id.butt_notify_custom,pendingIntent);

    notify的id不同时,若PendingIntent能实现匹配,则可通过flag实现不同的效果,如:

    FLAG_ONE_SHOT:后续通知中的PendingIntent和第一天保持完全一致,单机任何一条后剩下的通知均无法正常打开

    支持一下
    扫一扫,支持Grooter
    • 微信扫一扫
    • 支付宝扫一扫