【Android】第二章 四大应用组件之Activity

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nupotian/article/details/73280010

第一节 activity理解

1.1 Servlet的理解回顾

1)  狭义:Servlet是一个interface, 我们的Servlet类都必须是此接口的实现类

2)  广义:Servlet是一种服务器端的组件, 用来处理 客户端(浏览器)提交的请求, 并返回一个响应界面

1.2 组件的特点

1)  它的类必须实现特定接口或继承特定类

2)  需要在配置文件中配置其全类名

3)  它的对象不是通过new来创建的, 而是系统自动创建的

4)  它的对象具有一定的生命周期, 它的类中有对应的生命周期回调方法

1.3 Activity的定义

1)  Activity, 直译为活动, 它是Android定义的四大应用组件之一,也是最重要用得最多的.

2)  Activity用来提供一个能让用户操作并与之交互的界面

3)  一个应用有多个界面, 也就是包含多个Activity

4)  打电话,发短信, 拍照,发邮件等功能都是通过Activity来做的

1.4 类比activity和servlet


第二节 理论概述_Intent和IntentFilter的理解

2.1Intent的理解

1)  Intent, 直译为意图, 也就是你想要做什么或想要去哪?

2)  Intent是Activity, Service和BroadcastReceiver这三个应用组件之间进行通信的信使,

3)  例如: 我要在Activity中启动另一个Actvity, 就必须使用Intent对象

4)  意图对象还可以携带数据

5)  注意: Intent不是Android中的四大应用组件之一

2.2 Intent的分类

显示意图 : 明确指定的目标组件的意图

创建对象 : Intent(Context context, Class clazz)

何时使用 : 当操作当前自己应用的组件时使用

隐式意图 : 没有明确指定目标组件的意图

创建对象 : Intent(String action)

何时使用 : 当操作其它应用的组件时使用

 

2.3 IntentFilter的理解

在配置Activity时, 可以为Activity指定一个IntentFilter的配置

如果你的Activity希望其它应用能访问到, 需要配置<intent-filter>

如果你想启动其它应用的界面你必须用隐式intent, 且目标界面Activty配置了<intent-filter>

它的作用类似于web中的为Servlet配置的<url-pattern>


2.3 理论概述_相关API

Intent: 意图

      Intent(Context packageContext,Class<?> cls) :  用于创建显示意图对象

      Intent(String action): 用于创建隐式意图对象

      putExtra(String name, Xxx value): 保存额外数据

      Xxx getXxxExtra(String name): 获取额外数据

      setData(Uri data): 设置有特定格式的uri数据

Activity: 活动

      startActivity(Intent intent): 一般启动Activity

      startActivityForResult(int reqCode,Intent intent): 带回调启动Activity

      onActivityResult(int reqCode, intresultCode, Intent data): 回调方法

      setResult(int resultCode, Intent data): 设置要返回的结果

      finish(): 结束当前Activity

      getIntent(): 得到启动Activity的意图

Activity生命周期相关方法

      onCreate()

     onStart()

     onResume()

     onPause()

     onRestart()

      onStop()

     onDestory()

View: 代表视图的根基类

      setOnClickListener(OnClickListener listener):设置点击监听

     setOnLongClickListener(OnLongListener listener): 设置长按监听

SmsManager: 发送短信的工具类

     staticSmsManager getDefault() : 得到当前对象

    sendTextMessage(...): 发送短信

设置点击监听的2种方式     

方式一:  Activity中添加监听: 

   view.setOnClickListener(OnClickListenerlistener);

方式二:  布局添加监听: 

   layout中:  android:onclick=“方法名”

   Activity中: public void 方法名(Viewv) {   }

设置长按监听

view.setOnLongClickListener(OnLongClickListenerlistener)

2.5 Activity使用测试_定义Activity


功能说明:

1. 在界面1点击”一般启动”: 启动界面2, 并显示界面1中输入的数据

2. 在界面2点击”一般返回”: 返回到界面1

3. 在界面1点击”带回调启动”: 启动界面2, 并显示界面1中输入的数据

4. 在界面2点击”带结果返回”: 返回到界面1, 并显示界面2中输入的数据

具体操作步骤如下

①首先创建一个Android application,项目名为L02_Activity

②界面布局及源码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >
    <EditText
        android:id="@+id/et_main_message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入您的信息">
    </EditText>
    <Button
        android:id="@+id/btn_main_start1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/et_main_message"
        android:text="一般启动" />
    <Button
        android:id="@+id/btn_main_start2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_main_start1"
        android:text="带回调启动" />
</RelativeLayout>

③实现activity功能

1)  定义所有需要操作的视图对象并初始化

2)  给视图设置监听

3)  在回调方法中实现逻辑

 package com.xp.l02_activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
	private EditText et_main_message;
	private Button btn_main_start1;
	private Button btn_main_start2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化视图对象
        et_main_message=(EditText)findViewById(R.id.et_main_message);
        btn_main_start1=(Button)findViewById(R.id.btn_main_start1);
        btn_main_start2=(Button)findViewById(R.id.btn_main_start2);
        //设置点击监听
        btn_main_start1.setOnClickListener(this);
        btn_main_start2.setOnClickListener(this);
    }
	@Override
	public void onClick(View v) {//v就是发生事件的视图对象(操作的)
		if(v==btn_main_start1){
			Toast.makeText(this,"一般启动",0).show();
		}else if(v==btn_main_start2){
			Toast.makeText(this,"带回调启动",0).show();
		}
	}
}

第五节 activity使用测试_定义activity

5.1实现一般启动

1)定义好界面二

1、布局  

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >
    <EditText
        android:id="@+id/et_second_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" >
        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/btn_second_back1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/et_second_message"
        android:text="一般返回" />

     <Button
         android:id="@+id/btn_second_back2"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignParentLeft="true"
         android:layout_below="@+id/btn_second_back1"
         android:text="带结果返回" />
	
</RelativeLayout>

2、定义Activity类的子类SecondActivity (包名右键选择other→Android activity)

3、在AndroidManifest.xml配置定义的组件

<activity

           android:name=".SecondActivity"

           android:label="@string/title_activity_second">

       </activity>

4、重写onCreate(),并加载布局

   super.onCreate(savedInstanceState);

     setContentView(R.layout.activity_second);

第六节 Activity使用测试_一般启动和结束

启动一个activity

一般启动

   startActivity(Intent intent)

 

带回调的启动

   startActivityForResult(intreqCode, Intent intent)

    onActivityResult(int reqCode, int resultCode,Intent data)

如何携带额外数据

   intent.putExtra(name, value)

如何获取携带的额外数据

   Xxx intent.getXxxExtra(name)

如何得到启动的intent

   Intent getIntent()

结束一个Activity

一般结束finish()

带结果的结束setResult(int resultCode, Intent data) finish()

启动界面二

1) 创建Intend对象(显示)

2) 通过intent携带额外数据

3) 启动activity

4) 得到intent对象

5) 通过intent对象读取额外数据

6) 显示EditText

具体源码如下

package com.xp.l02_activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
	private EditText et_main_message;
	private Button btn_main_start1;
	private Button btn_main_start2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_main_message=(EditText)findViewById(R.id.et_main_message);
        btn_main_start1=(Button)findViewById(R.id.btn_main_start1);
        btn_main_start2=(Button)findViewById(R.id.btn_main_start2);
        //设置点击监听
        btn_main_start1.setOnClickListener(this);
        btn_main_start2.setOnClickListener(this);

    }
	@Override
	public void onClick(View v) {
		if(v==btn_main_start1){
			Toast.makeText(this,"一般启动",0).show();
			//1)创建intent对象
			Intent intent = new Intent(this, SecondActivity.class);
			//2). 通过intent携带额外数据
			String message = et_main_message.getText().toString();
			intent.putExtra("MESSAGE", message);
			//3). 启动Activity
			startActivity(intent);
		}else if(v==btn_main_start2) {
			//Toast.makeText(this, "带回调启动", 0).show();
			
			//1). 创建Intent对象(显式)
			Intent intent = new Intent(this, SecondActivity.class);
			//2). 通过intent携带额外数据
			String message = et_main_message.getText().toString();
			intent.putExtra("MESSAGE", message);
			//3). 带回调启动Activity
			int requestCode = 2;
			startActivityForResult(intent, requestCode);
		}
	}
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		//判断code
		if(requestCode==2 && resultCode==3) {
			//从data中取出数据
			String result = data.getStringExtra("RESULT");
			//显示
			et_main_message.setText(result);
		}
	}
}

第七节 Activity使用测试_带回调启动与带结果返回

package com.xp.l02_activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class SecondActivity extends Activity {
	private EditText et_second_message;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
		et_second_message=(EditText)findViewById(R.id.et_second_message);
		//4). 得到intent对象
		Intent intent = getIntent();
		//5). 通过intent读取额外数据
		String message = intent.getStringExtra("MESSAGE");
		//6). 显示到EditText
		et_second_message.setText(message);
	}
	public void back1(View v) {
		//关闭当前界面
		finish();
	}
	public void back2(View v) {
		//保存一个结果
		int resultCode = 3;
			//准备一个带额外数据的intent对象
		Intent data = new Intent();
		String result = et_second_message.getText().toString();
		data.putExtra("RESULT", result);
			//设置结果
		setResult(resultCode, data );
		//关闭当前界面
		finish();
	}
}

第八节 Activity使用测试_Activity的启动流程

启动一个Activity的流程图

第九节 Activity界面的四种状态

运行状态: 可见也可操作

暂停状态: 可见但不可操作

停止状态: 不可见,但对象存在

死亡状态: 对象不存在

第十节 Activity生命周期_测试

10.1 activity的生命周期回调方法

onCreate()

onStart()

onResume()

onPause()

onRestart()

onStop()

onDestory()

10.2 activity的生命周期图

package com.xp.l02_life;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

/**
 *测试用例 
 * @author Administrator
 1)界面从“死亡”-->“运行" 
    创建对象-->onCreate()-->onStart()-->onResume()---可见可操作(运行状态)
2) 界面从“运行”-->“死亡" 
    onPause()-->onStop()-->onDestroy()-->Activity对象成为垃圾对象---不可见也不存在死亡状态)
3) 界面从“运行”-->“停止" 
    onPause()-->onStop()---不可见但存在
4) 界面从“停止” -->“运行"
    onRestart()-->onStart()-->onResume()
5) 界面从“运行”-->“暂停" 
    onPause()
6) 界面从“暂停” -->“运行"
   onResume()
   重要的:
   1. onCreate(): 在Activity对象创建后调用, 只执行一次
   2. onDestroy(): 在Activity死亡之前调用, 只执行一次
   3. onResume(): 界面只有经历此方法才能可见可操作
 */
public class MainActivity extends Activity{
	public MainActivity() {
		Log.e("TAG", "MainActivity()");
	}
		@Override
	protected void onCreate(Bundle savedInstanceState) {
		Log.e("TAG", "onCreate()");
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	@Override
	protected void onStart() {
		Log.e("TAG", "onStart()");
		super.onStart();
	}
	@Override
	protected void onResume() {
		Log.e("TAG", "onResume()");
		super.onResume();
	}
	@Override
	protected void onPause() {
		Log.e("TAG", "onPause()");
		super.onPause();
	}
	@Override
	protected void onStop() {
		Log.e("TAG", "onStop()");
		super.onStop();
	}
	@Override
	protected void onRestart() {
		Log.e("TAG", "onRestart()");
		super.onRestart();
	}
	@Override
	protected void onDestroy() {
		Log.e("TAG", "onDestroy()");
		super.onDestroy();
	}
	public void startSecond(View v) {
		startActivity(new Intent(this, SecondActivity.class));
	}
}

Activity生命周期与状态

11_Activity高级特性_Activity的TaskStack

在Android中,系统用Task Stack (Back Stack)结构来存储管理启动的Activity对象

一个应用启动,系统就会为其创建一个对应的Task Stack来存储并管理该应用的Activity对象

只有最上面的任务栈的栈顶的Activity才能显示在窗口中

第十二节 Activity的launchMode

在Android中, 启动一个Activity有时需要总是创建一个新对象, 有时需要复用已有的对象, 可以通过在配置activity时通过launchMode属性指定

launchMode属性值(4个)为:

1)  standard:标准模式,每次调用startActivity()方法就会产生一个新的实例。

2)  singleTop:如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例;如果不位于栈顶,会产生一个新的实例。

3)  singleTask:只有一个实例, 默认在当前Task中

4)  singleInstance:只有一个实例, 创建时会新建一个栈, 且此栈中不能有其它对象

测试用例


package com.xp.l02_lauchmode;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends Activity{
	public MainActivity() {
		Log.e("TAG", "MainActivity()");
	}
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		Log.e("TAG", "onCreate()");
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	public void startSecond(View v) {
		startActivity(new Intent(this, SecondActivity.class));
	}
	public void startFrist(View v) {
		startActivity(new Intent(this, MainActivity.class));
	}
}
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

/**
 * 界面二
 * @author Administrator
 */
public class SecondActivity extends Activity {
	public SecondActivity() {
		Log.e("TAG", "SecondActivity()");
	}
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
	}
	
	public void startFrist(View v) {
		startActivity(new Intent(this, MainActivity.class));
	}
	
	public void startThird(View v) {
		startActivity(new Intent(this, ThirdActivity.class));
	}
}
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class ThirdActivity extends Activity {

	public ThirdActivity() {
		Log.e("TAG", "ThirdActivity()");
	}
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_third);
	}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xp.l02_lauchmode"
    android:versionCode="1"
    android:versionName="1.0" >

    <!-- ctrl+shift+x/y -->
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SecondActivity"
            android:label="@string/title_activity_second" 
            android:launchMode="singleInstance"/>
        <activity
            android:name=".ThirdActivity"
            android:label="@string/title_activity_third" >
        </activity>
    </application>

</manifest>

第十三节 应用练习_界面布局

功能描述:

1). 点击”打电话”:进入拨号界面
2). 长按”打电话”: 直接拨打电话
3). 点击”发短信”: 进入编辑短信界面
4). 长按”发短信”: 直接将短信发送出去

技术点:

1). 布局的设计         

2). 点击事件和长按事件监听的添加

3). 使用隐式意图拨打电话,进入拨号界面, 进入发短信界面: 4). 使用SmsMessager发送短信

5). 权限的声明(如打电话, 发短信)

1. 界面布局

   1). 分析: 垂直的LinearLayout--->水平的LinearLayout

   2). 编码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="电话号码: " />

        <EditText
            android:id="@+id/et_main_number"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="请输入号码">
        </EditText>
    </LinearLayout>
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="短信内容: " />

        <EditText
            android:id="@+id/et_main_sms"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="请输入短信">
        </EditText>
    </LinearLayout>
    
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/btn_main_call"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="打电话" />

        <Button
            android:id="@+id/btn_main_send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="发短信" />
    </LinearLayout>
</LinearLayout>

2. 在Activity中初始化需要操作的视图对象

3. 给button设置点击监听

4. 给button设置长按监听

5. 点击打电话进入拨号界面

   1). 创建一个Intent(隐式)

   2). 携带数据

   3).startActivity(intent)

6. 长按打电话进入打电话的界面

   1). 创建一个Intent(隐式)

   2). 携带数据

   3). startActivity(intent) 

7. 点击发短信进入短信编辑界面

   1). 创建一个Intent(隐式)

   2). 携带数据(号码/内容)

   3).startActivity(intent) 

8. 长按发短信直接发短信

   1). 得到SmsManager的对象

   2). 发送文本信息(短信)

package com.xp.app02_activity;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
第十五节 应用练习_添加点击和长按监听
public class MainActivity extends Activity implements OnLongClickListener {
	private EditText et_main_number;
	private EditText et_main_sms;
	private Button btn_main_call;
	private Button btn_main_send;
	private OnClickListener onClickListener = new View.OnClickListener() {
		@Override
		public void onClick(View v) {
			if(v==btn_main_call) {//点击打电话
				//Toast.makeText(MainActivity.this, "点击打电话", 0).show();
				
				//1). 创建一个Intent(隐式)
				//08-28 03:27:09.976: I/ActivityManager(1222): Displayed com.android.dialer/.DialtactsActivity: +535ms
				String action = "android.intent.action.DIAL";
				action = Intent.ACTION_DIAL;//一样的
				Intent intent = new Intent(action);
				//2). 携带数据
				String number = et_main_number.getText().toString();
				intent.setData(Uri.parse("tel:"+number)); //<data android:scheme="tel" />
				//3). startActivity(intent)
				startActivity(intent);
			}else if(v==btn_main_send) {//点击发短信
				Toast.makeText(MainActivity.this, "点击发短信", 0).show();

第十六节 点击进入拨号界面

//1). 创建一个Intent(隐式)
				//08-28 04:00:02.420: I/ActivityManager(1222): Displayed com.android.mms/.ui.ComposeMessageActivity: +132ms
				Intent intent = new Intent(Intent.ACTION_SENDTO);//android.intent.action.SENDTO
				//2). 携带数据(号码/内容)
				String number = et_main_number.getText().toString();
第十七节打电话和发短信   

String sms = et_main_sms.getText().toString();
				intent.setData(Uri.parse("smsto:"+number));
				//携带额外数据
				intent.putExtra("sms_body", sms);
				//3). startActivity(intent)
				startActivity(intent);
			}
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//初始化视图对象
		et_main_number = (EditText) findViewById(R.id.et_main_number);
		et_main_sms = (EditText) findViewById(R.id.et_main_sms);
		btn_main_call = (Button) findViewById(R.id.btn_main_call);
		btn_main_send = (Button) findViewById(R.id.btn_main_send);
		//给视图对象设置点击监听
		btn_main_call.setOnClickListener(onClickListener);
		btn_main_send.setOnClickListener(onClickListener);
		//给视图对象设置长按监听
		btn_main_call.setOnLongClickListener(this);
		btn_main_send.setOnLongClickListener(this);
	}
	
	@Override
//常按监听		
public boolean onLongClick(View v) {
		if(v==btn_main_call) {//长按打电话
			//Toast.makeText(MainActivity.this, "长按打电话", 0).show();
			//1). 创建一个Intent(隐式)
			//08-28 03:38:59.717: I/ActivityManager(1222): Displayed com.android.phone/.PrivilegedOutgoingCallBroadcaster: +570ms
			Intent intent = new Intent(Intent.ACTION_CALL);//android.intent.action.CALL
			//2). 携带数据
			String number = et_main_number.getText().toString();
			intent.setData(Uri.parse("tel:"+number));
			//3). startActivity(intent)
			startActivity(intent);

第十八节 长按直接发短信

}else if(v==btn_main_send) {//长按发短信
			Toast.makeText(MainActivity.this, "长按发短信", 0).show();
			
			//1). 得到SmsManager的对象
			SmsManager smsManager = SmsManager.getDefault();
			//2). 发送文本信息(短信)
			String number = et_main_number.getText().toString();
			String sms = et_main_sms.getText().toString();
			smsManager.sendTextMessage(number, null, sms, null, null);
		}
		return true;//不会再触发点击事件(表示此事件已经被消费了)
	}
}

•     进入电话拨打界面的意图: Intent.ACTION_DIAL

•     进入短信编辑界面的意图: Intent.ACTION_SENDTO

•     拨打电话的意图: Intent.ACTION_CALL

•     发送短信的工具类: SmsManager

•     需要的权限:

   打电话的权限: android.permission.CALL_PHONE

   发短信的权限: android.permission.SEND_SMS

•     拨打电话的Uri: tel:110

•     进入短信界面的电话Uri : smsto:110

•     携带额外短信数据的标识名为: sms_body
















猜你喜欢

转载自blog.csdn.net/nupotian/article/details/73280010