• Android:隐式 Intent 调用标准 Action


    隐式 Intent

    隐式 Intent 调用过程根据动作名称及可处理的数据类型,找到匹配的 Activity 组件,并解析所携带的数据 URI 完成对数据(消息)的处理。

    Intent 主要有以下 6 个重要属性。

    属性 说明
    Componentname(目标组件名称) 包含包名称和类名称,Componentname 被设置时就显式指定了要转向的组件,否则需要根据其他信息进行筛选查找
    Action(动作) 字符串,代表系统定义的常用的动作
    Data(数据) 通常是 UR I格式定义的操作数据。
    Category(类别) 指定当前 Action 被执行的环境,android.intent.category.LAUNCHER 表示启动程序时就将被执行,默认值为CATEGORY_DEFAULT
    Extras(附加) 传递额外数据
    Flags(标记) 指示 Android 如何启动目标 Activity

    隐式 Intent 对象定义

    使用隐式 Activity 时,需要为 Intent 对象定义 Action、Category 和 Data 数学,然后使用 startActivity() 方法就能调用对应的 Activity。使用 satAction() 方法可以为 Intent 对象设置动作:

    public Intent setAction(String action)
    

    使用 satData() 方法可以为 Intent 对象设置动作:

    public Intent setData(android.net.Uri data)
    

    其中 Data 使用的是 android.net.Uri 类型,使用 Uri.parse() 把字符串解析为 Uri 类型。

    public static Uri parse(String uriString)
    

    Action 字符串常量

    Action 常量 对应字符串 说明
    ACTION_MAIN android.intent.action.MAIN 应用程序入口
    ACTION_VIEW android.intent.action.VIEW 显示指定数据
    ACTION_ATTACH_DAT Aandroid.intent.action.ATTACH DATA 指定某块数据将被附加到其他地方
    ACTION_EDIT android.intent.action.EDIT 编辑指定数据
    ACTION_PICK android.intent.action.PICK 从列表中选择某项并返回所选的数据
    ACTION_CHOOSER android.intent.action.CHOOSER 显示一个 Activity 选择器
    ACTION_GET_CONTENT android.intent.action.GET_CONTENT 让用户选择数据,并返回所选数据
    ACTION_DIAL android.intent.action.DIAL 显示拨号面板
    ACTION_CALL android.intent.action.CALL 直接向指定用户打电话
    ACTION_SEND android.intent.action.SEND 向其他人发送数据
    ACTION_SENDTO android.intent.action.SENDTO 向其他人发送消息
    ACTION_ANSWER android.intent.action.ANSWER 应答电话
    ACTION_INSERT android.intent.action.INSERT 插入数据
    ACTION_DELETE android.intent.action.DELETE 删除数据
    ACTION_RUN android.intent.action.RUN 运行数据
    ACTION_SYNC android.intent.action.SYNC 执行数据同步
    ACTION_PICK_ACTIVITY android.intent.action.PICK_ACTIVITY 用于选择 Activity
    ACTION_SEARCH android.intent.action.SEARCH 执行搜索
    ACTION_WEB_SEARCH android.intent.action.WEB_SEARCH 执行 Web 搜索

    调用标准 Action 样例

    浏览器打开百度网页

    uri = Uri.parse("http://www.baidu.com");
    intent = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(intent);
    

    打开拨号页面

    intent.setAction(Intent.ACTION_DIAL);         
    intent.setData(Uri.parse("tel:12345678910"));
    startActivity(intent);
    

    直接拨打电话

    安装程序首先要在 AndroidManifest.xml 文件中添加 CALL_PHONE 权限:

    <uses-permission android:name="android.permission.CALL_PHONE"/>
    

    直接拨打电话的代码如下:

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

    打开短信页面

    安装程序首先要在 AndroidManifest.xml 文件中添加 READ_SMS 权限:

    <uses-permission android:name="android.permission.READ_SMS"/>
    

    打开短信页面的代码如下:

    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setType("vnd.android-dir/mms-sms");
    startActivity(intent);
    

    给指定的人发送短信

    安装程序首先要在 AndroidManifest.xml 文件中添加 SEND_SMS 权限:

    <uses-permission android:name="android.permission.SEND_SMS"/>
    

    给指定的人发送短信的代码如下:

    intent = new Intent(Intent.ACTION_VIEW, Uri.parse("smsto:12345678910"));
    intent.putExtra("sms_body", "The SMS text");
    startActivity(intent);
    

    播放文件中的音乐

    intent = new Intent(Intent.ACTION_VIEW);
    uri = Uri.parse("file:///sdcard/误入迷失森林.mp3");
    intent.setDataAndType(uri, "audio/*");
    startActivity(intent);
    

    卸载程序

    安装程序首先要在 AndroidManifest.xml 文件中添加 REQUEST_DELETE_PACKAGES 权限:

    <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES"/>
    

    卸载程序的代码如下:

    intent = new Intent(Intent.ACTION_DELETE);
    uri = Uri.parse("package:程序的包名");
    intent.setData(uri);
    startActivity(intent);
    

    安装程序

    安装程序首先要在 AndroidManifest.xml 文件中添加 REQUEST_INSTALL_PACKAGES 权限:

    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
    

    安装程序有 2 种方法,第一种是使用 ACTION_VIEW,指定 apk 包的路径安装。

    intent = new Intent(Intent.ACTION_VIEW);
    uri = Uri.fromFile(new File("/文件路径/程序名.apk"));
    intent.setDataAndType(uri, "application/vnd.android.package-archive");
    startActivity(intent);
    


    第二种是使用 ACTION_INSTALL_PACKAGE,通过包名匹配安装。

    uri = Uri.fromParts("package", "com.example.myapplication3", null);
    intent = new Intent(Intent.ACTION_INSTALL_PACKAGE, uri);
    startActivity(intent);
    

    完整代码

    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapplication3">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.MyApplication3">
            <activity
                android:name=".MainActivity"
                android:exported="true">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        <uses-permission android:name="android.permission.CALL_PHONE"/>
        <uses-permission android:name="android.permission.SEND_SMS"/>
        <uses-permission android:name="android.permission.READ_SMS"/>
        <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES"/>
        <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
    </manifest>
    

    MainActivity

    package com.example.myapplication3;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Build;
    import android.os.Bundle;
    import java.io.File;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.StrictMode;
    import android.view.View;
    
    public class MainActivity extends AppCompatActivity {
    
        Intent intent = new Intent();
        private Uri uri = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                builder.detectFileUriExposure();
            }
        }
    
        @SuppressWarnings("deprecation")
        public void doClick(View view) {
            switch (view.getId()) {
                case R.id.button1:
                    // 打开百度浏览器
                    uri = Uri.parse("http://www.baidu.com");
                    intent = new Intent(Intent.ACTION_VIEW, uri);
                    startActivity(intent);
                    break;
    
                case R.id.button2:
                    // 打电话
                    // Intent.ACTION_DIAL 跳到拨号界面
                    intent.setAction(Intent.ACTION_DIAL);
                    intent.setData(Uri.parse("tel:12345678910"));
                    startActivity(intent);
                    break;
    
                case R.id.button3:
                    // 打电话
                    // Intent.ACTION_CALL 直接打电话
                    intent.setAction(Intent.ACTION_CALL);
                    intent.setData(Uri.parse("tel:12345678910"));
                    startActivity(intent);
                    break;
    
                case R.id.button4:
                    // 打开短信页面
                    Intent intent = new Intent(Intent.ACTION_MAIN);
                    intent.setType("vnd.android-dir/mms-sms");
                    startActivity(intent);
                    break;
    
                case R.id.button5:
                    // 发送短信
                    intent = new Intent(Intent.ACTION_VIEW,
                            Uri.parse("smsto:12345678910"));
                    intent.putExtra("sms_body", "The SMS text");
                    startActivity(intent);
                    break;
    
                case R.id.button6:
                    // 播放音乐
                    intent = new Intent(Intent.ACTION_VIEW);
                    uri = Uri.parse("file:///sdcard/误入迷失森林.mp3");
                    intent.setDataAndType(uri, "audio/*");
                    startActivity(intent);
                    break;
    
                case R.id.button7:
                    // 卸载程序
                    intent = new Intent(Intent.ACTION_DELETE);
                    uri = Uri.parse("package:com.example.myapplication3");
                    intent.setData(uri);
                    startActivity(intent);
                    break;
    
                case R.id.button8:
                    // 安装程序
                    intent = new Intent(Intent.ACTION_VIEW);
                    uri = Uri.fromFile(new File("/sdcard/app-debug.apk"));
                    intent.setDataAndType(uri, "application/vnd.android.package-archive");
                    startActivity(intent);
                    break;
    
                case R.id.button9:
                    // 安装程序2
                    uri = Uri.fromParts("package", "com.example.myapplication3", null);
                    intent = new Intent(Intent.ACTION_INSTALL_PACKAGE, uri);
                    startActivity(intent);
                default:
                    break;
            }
        }
    }
    

    activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <Button
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:id="@+id/button1"
            android:onClick="doClick"
            android:text="打开指定网页" />
    
        <Button
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:id="@+id/button2"
            android:onClick="doClick"
            android:text="打开拨号面板"/>
    
        <Button
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:id="@+id/button3"
            android:onClick="doClick"
            android:text="直接拨打指定号码" />
    
        <Button
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:id="@+id/button4"
            android:onClick="doClick"
            android:text="打开发短信的界面" />
    
        <Button
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:id="@+id/button5"
            android:onClick="doClick"
            android:text="给指定的人发短信" />
    
        <Button
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:id="@+id/button6"
            android:onClick="doClick"
            android:text="播放指定路径的音乐" />
    
        <Button
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:id="@+id/button7"
            android:onClick="doClick"
            android:text="卸载程序" />
    
        <Button
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:id="@+id/button8"
            android:onClick="doClick"
            android:text="安装程序" />
    
        <Button
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:id="@+id/button9"
            android:onClick="doClick"
            android:text="安装程序2" />
    </LinearLayout>
    

    参考资料

    《零基础学 Android》,明日科技编著,吉林大学出版社
    《Android 移动应用开发》,杨谊 主编、喻德旷 副主编,人民邮电出版社

  • 相关阅读:
    Cookie的作用范围、设置、创建、获取的方法
    2020寒假总结14
    MyBatis中foreach传入参数为数组
    Springmvc接收数组参数
    寒假每日总结十
    2020寒假每日总结
    2020寒假总结八
    2020寒假每日总结七
    2020寒假每日总结四
    2020寒假总结三
  • 原文地址:https://www.cnblogs.com/linfangnan/p/15404969.html
Copyright © 2020-2023  润新知