使用Intent实现拨打电话和发送短信功能,返回系统桌面功能,ACTION_VIEW启动另一个Activity

1 Intent概述

一个Activity程序主要由Activity,Service和BroadcastReceiver3种组件组成,这3种组件是相互独立的,可以互相调用。这些组件之间的通信由Intent协助完成,Intent负责对一次操作的Action,Action涉及的Data,Extras进行描述,Android根据Intent的描述,负责找到对应的组件,将Intent传递给调用的组件。
由以下3种基本应用场景:
(1)开启Activity
将Intent对象传递给startActivity()方法,启动一个新的Activity;
将Intent对象传递给startActivityForResult()方法,需要获取返回结果时,在Activity的onActivityResult()里接收。
(2)开启Service
将Intent对象传递给startService()方法,启动一个新的Service;
将Intent对象传递给bindService()方法,可以建立调用组件与目标服务之间的连接。
(3)传递Broadcast
通过sendBroadcast(),sendOrderBroadcast()等方法。

2 Intent属性

Intent主要包含6种属性:Component name,Action,Category,Data,Extras和Flags。

属性

作用

Component name

指定为处理Intent对象的组件名称

Action

Intent要完成的一个动作

Category

用来对执行动作的类别进行描述

Data

向Action提供要操作的数据

Extras

向Action提供要操作的附加数据

Flags

提示Android程序如何去启动一个Activity

表1 Intent对象的属性及作用

2.1 Component name(组件名称)

组件名称:包名+类名
Component name可通过setComponent(),setClass()或setClassName()方法设置,并通过getComponent()方法读取。
(1)setComponent

public Intent setComponent(ComponentName component)

构造ComponentName对象:

ComponentName(Context context, Class<?> cls)

Intent intent = new Intent();
ComponentName componentName = new ComponentName(MainActivity.this, DetailActivity.class);
intent.setComponent(componentName);

ComponentName(String pkg, String cls)

Intent intent = new Intent();
ComponentName componentName = new ComponentName("com.hyh","com.hyh.test");
intent.setComponent(componentName);

(2)setClass

public Intent setClass(Context packageContext, Class<?> cls)

Intent intent = new Intent();
intent.setClass(this, DetailActivity.class);

(3)setClassName

public Intent setClassName(Context packageContext, String className)

Intent intent = new Intent();
intent.setClassName(this, "com.hyh.test");

(4)getComponent

public ComponentName getComponent()

2.2 Action(动作)

Action属性用来指定将要执行的动作。在Intent类中,定义了一系列action常量,目标组件包含Activity和Broadcast。
1 标准Activity动作
表2列出了用于启动Activity(Context.startActivity())的标准动作。

常量

对应字符串

说明

ACTION_MAIN

android.intent.action.MAIN

Activity启动,没有数据输入输出

ACTION_VIEW

android.intent.action.VIEW

将数据显示给用户

ACTION_EDIT

android.intent.action.EDIT

将数据显示给用户用于编辑

ACTION_PICK

android.intent.action.PICK

从数据种选择一项,并返回该项

ACTION_DIAL

android.intent.action.DIAL

使用提供的数字拨打电话

ACTION_CALL

android.intent.action.CALL

使用提供的数字给某人拨打电话

ACTION_SEND

android.intent.action.SEND

向某人发送消息,接收者未指定

ACTION_SENDTO

android.intent.action.SENDTO

向某人发送消息,接收者已指定

表2 标准Activity动作说明

2 标准广播动作
表3列出了用于接收广播(Context.RegisterReceiver()或配置文件中的<receiver>标签)的标准动作。

常量

对应字符串

说明

ACTION_BOOT_COMPLETED

android.intent.action.BOOT_COMPLETED

在系统启动完成后发出一次通知

ACTION_PACKAGE_ADDED

android.intent.action.PACKAGE_ADDED

通知新应用已经安装到设备上

ACTION_PACKAGE_CHANGED

android.intent.action.PACKAGE_CHANGED

通知已安装的应用程序包已经被修改

ACTION_PACKAGE_REMOVED

android.intent.action.PACKAGE_REMOVED

通知从设备中删除应用程序包

ACTION_PACKAGE_DATA_CLEARED

android.intent.action.PACKAGE_DATA_CLEARED

通知用户清空应用程序包中的数据

ACTION_BATTERY_CHANGED

android.intent.action.BATTERY_CHANGED

包含充电状态,等级和其他电池信息的广播

ACTION_SHUTDOWN

android.intent.action.SHUTDOWN

通知设备已经关闭

表3 标准广播动作说明
除了预定义的Action,我们可以自定义Action。自定义Action的字符串必须使用应用程序的包名作为前缀,如"com.hyh.test.DETAIL"。
一个Intent对象的Action通过setAction()方法设置,通过getAction()方法获取。
(1)setAction

public Intent setAction(String action)

static final String ACTION_DETAIL = "com.hyh.text.DETAIL";
Intent intent = new Intent();
intent.setAction(DetailActivity.ACTION_DETAIL);

同时需要在配置文件里配置<intent-filter>:

<intent-filter>
    <action android:name="com.hyh.test.DETAIL">
    <category android:name="android.intent.category.DEFAULT">
</intent-filter>

(2)getAction

public String getAction()

2.3 Data(数据)

数据是一个URI对象,通常包含数据的URI类型和MIME类型。常用的数据类型如表4:

操作类型

Data格式

示例

浏览网页

http://网页格式

http://www.baidu.com

拨打电话

tel:电话号码

tel:17622283361

发送短信

smsto:短信接收号码

smsto:17622283361

查找SD卡文件

file:///sdcard/dir

file:///sdcard/Download/1.jpg

显示地图

geo:坐标,坐标

geo:36.5,-26.7

联系人信息

content://联系人信息

content://com.android.contacts/contacts/1

表4 常用的数据类型
(1)setData

// data:要设置的数据URI
public Intent setData(Uri data)
// 要设置数据未联系人信息id为1的联系人数据
intent.setData(Uri.parse("content://com.android.contacts/contacts/1"));

(2)setType

// type:数据的MIME类型
public Intent setType(String type)

intent.setType("image/*");

(3)setDataAndType

public Intent setDataAndType(Uri data, String type)

(4)getData

public Uri getData()

(5)getType

public String getType()

2.4 Category(种类)

用来对执行动作的类别进行描述。常用的Category常量如表5:

常量

对应字符串

说明

CATEGORY_BROWSABLE

android.intent.category.BROWSABLE

让Activity可以安全地从浏览器调用

CATEGORY_TAB

android.intent.category.TAB

将Activity作为TabActivity的选项卡

CATEGORY_HOME

android.intent.category.HOME

用于返回Home Activity(系统桌面)

CATEGORY_APP_MARKET

android.intent.category.APP_MARKET

让Activity允许用户浏览和下载新应用

表5 常用Category说明
(1)addCategory()
为Intent添加种类信息

public Intent addCategory(String category)

(2)removeCategory()
从Intent中删除指定的种类信息

public void removeCategory(String category)

(3)getCategories()
获取所有与Intent相关的种类信息

public Set<String> getCategories()

2.5 Extras(附加信息)

Extras用于向Intent组件添加附加信息,采用键值对的形式保存附加信息。通常会将附加信息作为一个Bundle对象,使用putExtras()和getExtras()方法添加和读取。
(1)putExtras()

public Intent  putExtras(Bundle extras)

Bundle bundle = new Bundle();
bundle.putCharSequence("name","hyh");
intent.putExtras(bundle);

(2)getExtras()

public Bundle  getExtras()

2.6 Flags(标志)

Flags用来指示如何去启动一个Activity,如Activity属于哪个Task以及启动后如何处理,Task是一组以栈的模式聚集到一起的Activity组件的集合。常用的标志常量如表7:

常量

说明

FLAG_GRANT_READ_URI_PERMISSION

对Intent数据有读取权限

FLAG_GRANT_WRITE_URI_PERMISSION

对Intent数据有写入权限

FLAG_ACTIVITY_CLEAR_TOP

如果在当前task中有要启动的Activity,那么把该Activity之前的所有Activity都关掉,并把该Activity置前

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

新的Activity不会在最近启动的Activity的列表中保存

FLAG_ACTIVITY_MULTIPLE_TASK

新的Task总是会启动来处理Intent,而不管是否已经有一个Task可以处理相同的事情

FLAG_ACTIVITY_NEW_TASK

系统会检查当前已创建的Task中是否有需要启动的Activity的Task,若有则在该Task上创建Activity;若没有,则在新建的Task上创建Activity

FLAG_ACTIVITY_NO_HISTORY

新的Activity将不在历史Stack中保留,用户一旦离开,这个Activity自动关闭

表7 常用的标志常量
(1)setFlags()
多次使用会将之前的替换掉

public Intent setFlags(int flags)

intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

(2)addFlags()
多次使用将会添加多个标志

public Intent addFlags(int flags)

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

(3)getFlags()

public int getFlags()

3 Intent种类

Intent可以分为显示Intent和隐士Intent两种。

3.1 显式Intent

显式Intent是指在创建Intent对象时就指定接收者(Activity,Service和BroadcastReceiver)。如:

Intent intent = new Intent(MainActivity.this, DetailActivity.class);
startActivity(intent);

3.2 隐式Intent

隐式Intent是指在创建Intent对象时不指定具体的接收者,而是定义要执行的Action,Category和Data,Android系统根据相应的匹配机制找到要启动的Activity。
如,我们需要在自己的应用程序中展示一个网页,可以直接调用系统的浏览器:

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

4 Intent过滤器

使用隐式Intent时,系统需要根据某种匹配机制来找到要启动的Activity。这种机制是根据Intent过滤器来实现的。通常是在AndroidManifest.xml文件中使用<intent-filter>标记,也可以使用接口动态设置。这里介绍<intent-filter>标记。

4.1 <action>标记

<action>标记用于指定组件能响应的动作。
<action>标记的语法格式如下:

<action android:name="string" />
如
<action android:name="android.intent.action.MAIN" />

4.2 <data>标记

<data>标记用于向Action提供要操作的数据。URI可以分为scheme(协议),host(主机),port(端口),path(路径),组成格式如下:

<scheme>://<host>:<port>/<path>
如
content://com.hyh.test:200/folder/dir

4.3 <category>标记

<category>标记用于指定以何种方式去执行Intent请求的动作。
<category>标记的语法格式如下:

<category android:name="string" />
如
<action android:name="android.intent.category.TEST" />

5 使用Intent实现拨打电话,发送短信

PhoneSmsIntent:
MainActivity.java

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageButton imageButton = (ImageButton) findViewById(R.id.imageButton_phone);
        ImageButton imageButton1 = (ImageButton) findViewById(R.id.imageButton_sms);
        imageButton.setOnClickListener(l);
        imageButton1.setOnClickListener(l);
    }

    View.OnClickListener l = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            switch (v.getId()) {
                case R.id.imageButton_phone:
                    intent.setAction(intent.ACTION_DIAL); //调用拨号面板
                    intent.setData(Uri.parse("tel:18768193385")); //设置要拨打的号码
                    //intent.setData(Uri.parse("tel:17800928376")); //设置要拨打的号码
                    startActivity(intent);
                    break;
                case R.id.imageButton_sms:
                    intent.setAction(intent.ACTION_SENDTO); //调用发送短信息
                    intent.setData(Uri.parse("smsto:17800928376")); //设置要发送的号码
                    intent.putExtra("sms_body", "Welcome to Android!"); //设置要发送的信息内容
                    startActivity(intent);
            }
        }
    };
}

https://github.com/hanyuhang-hz/android-demos

6 使用Intent返回系统桌面

HomeIntent:
MainActivity.java

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 设置全屏显示
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        Button button= findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                // 设置action动作属性
                intent.setAction(intent.ACTION_MAIN);
                // 设置categoty种类显示主屏幕
                intent.addCategory(intent.CATEGORY_HOME);
                startActivity(intent);
            }
        });
    }
}

https://github.com/hanyuhang-hz/android-demos

7 使用Intent的ACTION_VIEW启动另外一个Activity

ActionViewIntent:
MainActivity.java

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button= (Button) findViewById(R.id.btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                // 为Intent设置动作
                intent.setAction(intent.ACTION_VIEW);
                startActivity(intent);
            }
        });
    }
}

由于有多个app匹配ACTION_VIEW,因此需要用户进行选择。
ContactsActivity.java

public class ContactsActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contacts);
        //设置全屏显示
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }
}

https://github.com/hanyuhang-hz/android-demos

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android平台上开发一个能够打电话发送短信的程序,可以使用Android提供的系统API和权限来实现。以下是一个简单的示例代码: 1. 添加权限到AndroidManifest.xml文件中 ```xml <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.SEND_SMS" /> ``` 2. 在Java代码中实现打电话发送短信功能 ```java import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.telephony.SmsManager; import android.view.View; import android.widget.Button; import android.widget.EditText; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; public class MainActivity extends AppCompatActivity { private static final int REQUEST_CALL_PHONE = 1; private static final int REQUEST_SEND_SMS = 2; private EditText phoneNumberEditText; private EditText messageEditText; private Button callButton; private Button sendMessageButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); phoneNumberEditText = findViewById(R.id.phone_number_edit_text); messageEditText = findViewById(R.id.message_edit_text); callButton = findViewById(R.id.call_button); sendMessageButton = findViewById(R.id.send_message_button); callButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String phoneNumber = phoneNumberEditText.getText().toString(); Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)); if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CALL_PHONE); } else { startActivity(callIntent); } } }); sendMessageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String phoneNumber = phoneNumberEditText.getText().toString(); String message = messageEditText.getText().toString(); SmsManager smsManager = SmsManager.getDefault(); if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, REQUEST_SEND_SMS); } else { smsManager.sendTextMessage(phoneNumber, null, message, null, null); } } }); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == REQUEST_CALL_PHONE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { callButton.performClick(); } } else if (requestCode == REQUEST_SEND_SMS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { sendMessageButton.performClick(); } } } } ``` 这个例子假设你在布局文件中使用了以下控件: ```xml <EditText android:id="@+id/phone_number_edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Phone number" /> <EditText android:id="@+id/message_edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Message" /> <Button android:id="@+id/call_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Call" /> <Button android:id="@+id/send_message_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Send message" /> ``` 当你点击“Call”按钮时,它会检查是否有打电话的权限。如果没有,它会向用户请求该权限。如果用户授予了权限,它会创建一个意图,用于打指定的电话号码。 当你点击“Send message”按钮时,它将检查是否有发送短信的权限。如果没有,它会向用户请求该权限。如果用户授予了权限,它将使用SmsManager类发送短信到指定的电话号码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值