Android快速入门 四大应用组件之一Activity(打电话和发短信)功能练习
发布日期:2021-06-29 15:03:10 浏览次数:4 分类:技术文章

本文共 16298 字,大约阅读时间需要 54 分钟。

一、理论概述

1、Activity的理解

(1)组件的特点:
  • 它的类必须实现特定的接口或继承特定类
  • 需要在配置文件中配置其全类名
  • 它的对象不是通过new来创建的,而是系统自动创建的
  • 它的对象具有一定的生命周期,它的类中有对应的生命周期的回调方法
(2)Activity的定义
  • Activity,直接翻译为活动,它是Android定义的四大应用组件之一,它也是最重要的用的最多的
  • Activity用来提供一个能让用户操作并与之交互的界面
  • 一个应用有多个用户界面,也就是包含多个Activity
  • 打电话,发短信,拍照,发邮件等功能都是通过Activity来做的
(3)类比Activity与Servlet

在这里插入图片描述

2、Intent和IntentFilter的理解

Intent
(1)Intent的理解
  • Intent,直译为意图,也就是你想要做什么事情,或者想去哪里?
  • Intent是Activity,Service和BoradcastReceiver这三个应用组件之间进行通信的信者
  • 例如:我要在Activity中启动另外一个Activity,就必须使用Intent对象
  • 意图对象还可以携带数据
  • 注意:Intent不是Android中的四大应用组件之一
(2)Intent的分类

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

  • 创建对象:Intent(Context context,Class clazz)
  • 何时使用:当操作当前自己应用的组件时使用

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

  • 创建对象::Intent(String action)
  • 何时使用:当操作其他应用的组件时候使用
IntentFilter
IntentFilter的理解

IntentFilter意图过滤器

在这里插入图片描述

3、相关API

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二、Activity的开发

1、Activity的使用

测试

在这里插入图片描述

(1)创建项目工程

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)界面布局

在这里插入图片描述

(3)实现Activity的功能:设计第一个界面
1)定义所有需要操作的视图对象,并初始化
2)给视图设置监听
3)在回调方法当中实现逻辑
package com.itzheng.lo2_activity;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;/* * 1、布局界面 * 2、实现Activity的功能 * 1)定义所有需要操作的视图对象并初始化 * 2)给视图设置监听 * 3)在回调方法当中实现逻辑 */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(); } }}
(4)实现Activity的功能:设计第二个界面(实现一般启动)
1)定义好界面二

a、布局

b、定义Activity类

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
activity_second.xml

c、配置好

d、重写onCreate(),方法并加载布局
在这里插入图片描述

package com.itzheng.lo2_activity;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;public class SecondActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); }}

AndroidManifest.xml当中

在这里插入图片描述

2)启动界面二

在MainActivity当中

1)创建Intent对象(显示)
2)通过intent额外携带数据
3)启动Activity

package com.itzheng.lo2_activity;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;/* * 1、布局界面 * 2、实现Activity的功能 * 1)定义所有需要操作的视图对象并初始化 * 2)给视图设置监听 * 3)在回调方法当中实现逻辑 */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(); //创建Intent对象(显示) Intent intent = new Intent(this, SecondActivity.class); //通过intent额外携带数据 String message = et_main_message.getText().toString(); intent.putExtra("MESSAGE",message); //启动Activity startActivity(intent); }else if(v==btn_main_start2){
Toast.makeText(this, "带回调的启动", 0).show(); } }}

在SecondActivity当中

1)得到intent对象
2)通过intent对象读取额外数据
3)显示到EditText当中

package com.itzheng.lo2_activity;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;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); //得到Intent对象 Intent intent = getIntent(); //通过intent读取额外数据 String message = intent.getStringExtra("MESSAGE"); //显示到EditText et_second_message.setText(message); }}

测试

在这里插入图片描述
在这里插入图片描述

3)实现一般返回

a、在显示Second界面的时候,Main界面其实还在,只是被覆盖了

b、关闭当前界面(回到上一个界面):finish()
修改activity_second.xml
在这里插入图片描述
修改SecondActivity类
在这里插入图片描述

4)实现带回调的启动与结果返回

在MainActivity当中

在这里插入图片描述

else if (v == btn_main_start2) {
Toast.makeText(this, "带回调的启动", 0).show(); // 创建Intent对象(显示) Intent intent = new Intent(this, SecondActivity.class); // 通过intent额外携带数据 String message = et_main_message.getText().toString(); intent.putExtra("MESSAGE", message); // 带回调启动Activity int requestCode = 2;// 请求码 startActivityForResult(intent, requestCode); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub // 判断code if (requestCode == 2 && resultCode == 3) {
// 从data当中取出数据 String result = data.getStringExtra("RESULT"); // 显示出来 et_main_message.setText(result); } }

在SecondActivity

在这里插入图片描述

public void back2(View v){
//保存结果,准备一个带额外数据的intent对象 Intent data = new Intent(); data.putExtra("RESULT", et_second_message.getText().toString()); int resultCode = 3;//结果码 //设置返回的结果 setResult(resultCode,data); //关闭当前界面 finish(); }

测试

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(5)启动一个Activity的流程图

在这里插入图片描述

2、Activity的生命周期

(1)安卓界面的四种状态

在这里插入图片描述

(2)Activity的方法

在这里插入图片描述

(3)测试应用理解上诉方法

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/* * 1)界面从“死亡”--->“运行” * 2)界面从“运行”--->“死亡” * 3)界面从“运行”--->“停止” * 4)界面从“停止”--->“运行” * 5)界面从“运行”--->“暂停” * 6)界面从“暂停”--->“运行” */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 onDestroy() {
Log.e("TAG", "onDestroy()"); super.onDestroy(); } @Override protected void onRestart() {
Log.e("TAG", "onRestart()"); super.onRestart(); } }
  • 1)界面从“死亡”—>“运行”:将程序运行即可
    在这里插入图片描述
    创建对象–>创建Activity–>开始运行Activity–>正在运行Activity
  • 2)界面从“运行”—>“死亡”
    点击返回键
    在这里插入图片描述
    在这里插入图片描述
    暂停(休眠)–>停止–>销毁
  • 3)界面从“运行”—>“停止”
    点击HOME

在这里插入图片描述

在这里插入图片描述
暂停–>停止

  • 4)界面从“停止”—>“运行”
    长按HOME键
    在这里插入图片描述
    在这里插入图片描述
    从新开始–>开始–>正在运行
  • 5)界面从“运行”—>“暂停”
    a. 修改布局activity_main界面
    添加一个按钮
    在这里插入图片描述

b.在MainActivity类当中添加方法

在这里插入图片描述

public void startSecond(View v){
startActivity(new Intent(this,SecondActivity.class)); }

c.创建SecondActivity类

在这里插入图片描述
d.修改activity_second.xml
在这里插入图片描述

e.修改AndroidManifest.xml

在这里插入图片描述
f.运行
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

暂停

  • 6)界面从“暂停”—>“运行”
    点空白处
    在这里插入图片描述
    在这里插入图片描述
    运行

3、Activity的TaskStack

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 只有最上面的任务栈的栈顶的Activity才能显示在窗口当中
    在这里插入图片描述

4、Activity的launchMode

在这里插入图片描述

5、通过创建一个工程来掌握上诉的方法以及内容

创建MainActivity,SecondActivity,

ThreeActivity以及对应的布局文件activity_main.xml,activity_second.xml,activity_three.xml

(1)standard模式

在这里插入图片描述

MainActivity
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 startFirst(View v) {
startActivity(new Intent(this, MainActivity.class)); }}
activity_main.xml
SecondActivity
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 startThree(View v) {
startActivity(new Intent(this, ThreeActivity.class)); } public void startFirst(View v) {
startActivity(new Intent(this, MainActivity.class)); }}
activity_second.xml
ThreeActivity
public class ThreeActivity extends Activity {
public ThreeActivity(){
Log.e("TAG", "ThreeActivity()"); } @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_three); }}
activity_three.xml
测试

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运行结果

在这里插入图片描述

(2)singleTop(顶部单例)模式
修改AndroidManifest.xml
android:launchMode="singleTop"

在这里插入图片描述

启动界面后在主界面上点击启动界面1没有反应,在界面2 点击启动界面1的时候,会重新创建一个界面1

(3)singleTask模式

在这里插入图片描述

无论在什么位置点击启动界面1只会创建一个界面1,将界面2销毁了

(4)singleInstance在这里插入图片描述

点击界面2,启动界面2,点击界面3,启动界面3,点击返回则启动界面1,点击返回启动界面2

设置singleInstance的界面会新栈,之前创建的栈当中没有界面2,只有界面3和界面1

总结

在这里插入图片描述

在这里插入图片描述

三、功能练习

1、打电话和发短信(工程搭建以及界面布局)

在这里插入图片描述

(1)创建App02_Activity

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)界面布局

1)分析界面结构:垂直的LinearLayout(内水平的LinearLayout)

2)编写代码:

在这里插入图片描述

(3)在Activity当中初始化需要操作的视图对象

MainActivity

package com.itzheng.app02_activity;import android.app.Activity;import android.os.Bundle;import android.widget.Button;import android.widget.EditText;public class MainActivity extends Activity {
private EditText et_main_number; private EditText et_main_sms; private Button btn_main_call; private Button btn_main_send; @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); }}
(4)给视图当中的button设置点击监听 ,给视图当中button设置长按监听

在这里插入图片描述

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(); } else if (v == btn_main_send) {
// 点击发短信 Toast.makeText(MainActivity.this, "点击发短信", 0).show(); } } }; @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(this, "长按打电话", 0).show(); } else if (v == btn_main_send) {
// 长按发短信 Toast.makeText(this, "长按发短信", 0).show(); } return true; }}

2、实现打电话

(1)实现点击打电话,进入拨打的界面:修改MainActivity的onClick

a、创建一个Intent(隐式);

b、携带数据
c、startActivity(intent);
在模拟器当中启动电话,观察LogCat当中的ActivityManger对应的内容
在这里插入图片描述

@Override		public void onClick(View v) {
if (v == btn_main_call) {
// 点击的是打电话 // Toast.makeText(MainActivity.this, "点击打电话", 0).show(); // a、创建一个Intent(隐式); String action = "android.intent.action.DIAL"; action = Intent.ACTION_DIAL;// 和上面的android.intent.action.DIAL一样 Intent intent = new Intent(action); // b、携带数据 String number = et_main_number.getEditableText().toString(); intent.setData(Uri.parse("tel:" + number));//tel:固定前缀
// c、startActivity(intent); startActivity(intent); } else if (v == btn_main_send) {
// 点击发短信 Toast.makeText(MainActivity.this, "点击发短信", 0).show(); } }

在这里插入图片描述

在这里插入图片描述

(2)长按“打电话”:直接进入拨打电话界面修改MainActivity的onLongClick

a、创建一个Intent(隐式);

b、携带数据
c、startActivity(intent);
在这里插入图片描述
在这里插入图片描述

@Override	public boolean onLongClick(View v) {
if (v == btn_main_call) {
// 长按打电话 //Toast.makeText(this, "长按打电话", 0).show(); //a、创建一个Intent(隐式); Intent intent = new Intent(Intent.ACTION_CALL);//android.intent.action.CALL //b、携带数据 String number = et_main_number.getEditableText().toString(); intent.setData(Uri.parse("tel:"+number)); //c、startActivity(intent); startActivity(intent); } else if (v == btn_main_send) {
// 长按发短信 Toast.makeText(this, "长按发短信", 0).show(); } return true;// 表示此事件已经被消费了,不会再触发点击事件 }

直接运行会抛出异常,权限被拒绝

在这里插入图片描述

(3)添加权限

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(4)测试运行

在这里插入图片描述

在这里插入图片描述

3、实现发短信

(1)实现单击进入短信编辑界面

a、创建一个Intent(隐式);

b、携带数据
c、startActivity(intent);
在这里插入图片描述

//Toast.makeText(MainActivity.this, "点击发短信", 0).show();				//a、创建一个Intent(隐式);				Intent intent = new Intent(Intent.ACTION_SENDTO);//android.intent.action.SENDTO				//b、携带数据(号码/内容)				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);//携带额外数据				//c、startActivity(intent);				startActivity(intent);

在这里插入图片描述

在这里插入图片描述

(2)实现长按直接发送短信

需要创建另外一个模拟器

在这里插入图片描述
在这里插入图片描述
a、得到SmsManager对象
b、发送文本信息(短信)
在这里插入图片描述

else if (v == btn_main_send) {
// 长按发短信 Toast.makeText(this, "长按发短信", 0).show(); //a、得到SmsManager对象 SmsManager manager = SmsManager.getDefault(); //b、发送文本信息(短信) String number = et_main_number.getText().toString(); String sms = et_main_sms.getText().toString(); manager.sendTextMessage(number, null, sms, null, null); }

运行的时候选择5556

在这里插入图片描述
直接发送会报错,权限不足,添加发短信的权限
在这里插入图片描述

5556发送短信

在这里插入图片描述
5554接收到短信
在这里插入图片描述

三、知识点总结

1、Activity的理解

a、活动:四大应用组件之一
b、作用:提供能让用户操作并与之交互的界面
c、组件:组件的特点
它的类必须实现特定接口或继承特定类	需要在配置文件中配置其全类名	它的对象不是通过new来创建的,而是系统自动创建的(反射)	它的对象具有一定的生命周期,它的类中有对应的生命周期回调方法
d、在应用开发的时候应用到反射的技术:
创建基类其他类继承,并会自动调用子类对应的方法	一旦有配置文件就应用到了反射	布局文件定义标签,通过标签对应的名称创建对象	显示意图:Intent(Context context,Class c)

2、Intent理解

a、意图:信使(Activity,Service,BroadcastReceiver三个组件间的通信)
b、分类:
显示:操作当前应用自己的组件	隐式:操作其他应用的组件

3、Intent的实验

a、创建:
显示意图:Intent(Content content,Class activityClass)	隐式:Intent(String action)//与Activity与
的action匹配
b、携带数据:
额外数据:putExtra(String key,Xxx value)内部用Map容器保存	特定前缀的数据:setData(Uri data)//data=tel:21212,smsto:21212c、读取获取数据	额外:Xxx getXxxExtra(String key)	有特定前缀:Uri getData()

4、Activity的使用

a、定义:
定义一个类extends Activity并重写生命周期方法	在功能清单文件当中使用
注册
b、启动
启动类型一:一般启动:startActivity(Intent intent)	启动类型二:带回调的启动startActivityForResult(Intent intent,int requestCode)	重写:onActivityResult(int requestCode,int resultCode,Intent data)
c、结束
一般结束:finish	带结果的结束:setResult(int resultCode,Intent data)

5、Activity的生命周期

a、Activity界面的状态
运行状态:可见也可操作	暂停状态:可见但不可操作	停止状态:不可见,但对象存在	死亡状态:对象不存在
b、Activity的生命周期流程:

在这里插入图片描述

三个重要的方法

onCreate():加载布局,初始化工作	onResume():只有经历此方法,才进入运行状态	onDestory();在对象死亡之前调用,做一些收尾或者清理的工作

6、TaskStack和lauchMode

任务栈和加载模式
a、TaskStack(后进先出)
在Android中,系统用Task Stack(Back Stack)结构来存储管理启动的Activity对象	一个应用启动,系统就会为其创建一个对应的Task Stack来存储并管理该应用的Activity对象只有最上面的任务栈的栈				 顶的Activity才能显示在窗口中
b、lunchMode:
standard:		标准模式,每次调用startActivity(方法就会产生一个新的实例。	singleTop:		如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例;如果不位于栈顶,会产生一个新的实例。		singleTask:		只有一个实例,默认在当前Task中	singleInstance:		只有一个实例,创建时会新建一个栈,且此栈中不能有其它对象

7、实现一个简单功能应用的步骤:

a:外观:分析界面组成,定义布局文件	b:行为:编写Activity的实现			在onCreate()中加载布局文件:setContextView(layoutId)			调用findViewById得到需要操作的所有视图对象保存成为成员变量			给视图对象设置监听器(点击/长按),在回调方法实现响应逻辑	2)使用隐式意图启动系统应用的界面			如何找到对应的Activity字符串:添加ActivityManager的Log日志,利用系统应用原码找到对应的Activity配置	3)权限:当调用一些系统比较重要的功能时候需要声明

转载地址:https://code100.blog.csdn.net/article/details/111649778 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java全栈开发---Java ERP系统开发:商业ERP(十三)CXF框架,物流BOS系统开发
下一篇:2021年Java何去何从,在人工智能,云计算,物联网,区域块链,大数据的背景下Java未来会怎样发展?(网友回答)

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月30日 18时09分47秒