美文网首页
隐式Intent

隐式Intent

作者: 爱做梦的严重精神病患者 | 来源:发表于2019-03-04 10:57 被阅读0次

      使用显示intent时,我们需要指定操作系统启动哪个activity
      使用隐式intent时,只需要告诉操作系统你想要做什么,操作系统就会去启动能够胜任工作任务的activity。如果找到多个符合的activity,用户会看到一个可选应用列表

    1.隐式intent的组成

    • 要执行的操作
      通常以Intent类中的常量来表示。例如Intent.ACTION_SEND。
    • 待访问数据的位置:
      可能时设备以外的资源,如某个URL,也可能是指向某个文件的URI,或者是某个内容URI。
    • 操作涉及的数据类型
      指MIME形式的数据类型,如text/html或audio/mpeg3。
    • 可选类别
      类别用来描述如何使用某个activity。例如,Android的android.intent.category.LAUNCHER类别表明,activity应该显示在顶级引用启动器中。

      基于以上信息,操作系统将启动适用的activity。通过配置文件中的intent过滤设置,activity会对外宣称自己是适合处理某类action的activity。

    <activity
            android:name=".BrowserActivity"
            android:label="@string/app_name">
            <intent-filter>
                   <action android:name="android.intent.action.VIEW"/>
                   <category android:name="android.intent.category.DEFAULT"/>
                   <data android:scheme="http" android:host="www.bignerdranch.com"/>
            <intent-filter>
    </activity>
    

      必须在intent过滤器中明确地设置DEFAULT类别。action元素告诉操作系统,activity能够胜任指定任务。DEFAULT类别告诉操作系统,activity愿意处理某项任务

    2.发送消息

    Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("text/plain");
    i.putExtra(Intent.EXTRA_TEXT,getCrimeReport());
    i.putExtra(Intent.EXTRA_SUBKECT, getString(R.string.crime_report_subject));
    startActivity(i);
    

      使用隐式intent启动activity时,也可以创建每次都显示的activity选择器。调用以下Intent方法并传入创建的隐式intent以及用作选择器标题的字符串:
    public static Intent createChooser(Intent target, String title)
    然后将createChooser(...)方法返回的intent传入startActivity(...)方法

    Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("text/plain");
    i.putExtra(Intent.EXTRA_TEXT,getCrimeReport());
    i.putExtra(Intent.EXTRA_SUBKECT, getString(R.string.crime_report_subject));
    i = Intent.createChooser(i, "title");
    startActivity(i);
    

    3.检查可响应任务的activity

      如果操作系统找不到匹配的activity,应用就会崩溃。首先通过操作系统中的PackageManager类进行自检
      Android设备上安装了哪些组件以及包括哪些activity,PackageManager类全部都知道。调用resolveActivity(Intent,int)方法,可以找到匹配给定Intent任务的activityflag标志MATCH_DEFAULT_ONLY限定只搜索带CATEGORY_DEFAULT标志的activity

    PackageManager packageManager = getActivity().getPakcageManager();
    if (packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) == null) {
            return;
    } else {
        ...
        //启动intent
    }
    

    相关文章

      网友评论

          本文标题:隐式Intent

          本文链接:https://www.haomeiwen.com/subject/vklbuqtx.html