Android快速入门 四大应用组件之一Activity(打电话和发短信)功能练习

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界面

添加一个按钮

在这里插入图片描述

<Button

android:id=“@+id/button1”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_centerHorizontal=“true”

android:layout_centerVertical=“true”

android:text=“启动界面二”

android:onClick=“startSecond”

/>

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

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:layout_width=“fill_parent”

android:layout_height=“fill_parent”

android:orientation=“vertical” >

<TextView

android:id=“@+id/textView1”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“界面1111111111” />

<Button

android:id=“@+id/button1”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“启动界面2”

android:onClick=“startSecond” />

<Button

android:id=“@+id/button2”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“启动界面1”

android:onClick=“startFirst” />

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

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:layout_width=“fill_parent”

android:layout_height=“fill_parent”

android:orientation=“vertical” >

<TextView

android:id=“@+id/textView1”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“界面22222222222” />

<Button

android:id=“@+id/button1”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“启动界面3”

android:onClick=“startThree” />

<Button

android:id=“@+id/button2”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“启动界面1”

android:onClick=“startFirst” />

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

<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=“ r e l a t i v e P a c k a g e . {relativePackage}. relativePackage.{activityClass}” >

<TextView

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“界面3333” />

测试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

运行结果

在这里插入图片描述

(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)编写代码:

<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=“请输入号码”>

<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=“请输入短信”>

<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=“发短信” />

在这里插入图片描述

(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:固定前缀 data-android:scheme=“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:21212

c、读取获取数据

额外:Xxx getXxxExtra(String key)

有特定前缀:Uri getData()

4、Activity的使用
a、定义:

定义一个类extends Activity并重写生命周期方法

在功能清单文件当中使用注册

b、启动

最后

其实要轻松掌握很简单,要点就两个:

  1. 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
  2. 多练。 (视频优势是互动感强,容易集中注意力)

你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

阿里P7Android高级教程

下面资料部分截图,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。

附送高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、近期面试跳槽、自身职业规划迷茫的朋友们。

Android核心高级技术PDF资料,BAT大厂面试真题解析;

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
( )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:21212

c、读取获取数据

额外:Xxx getXxxExtra(String key)

有特定前缀:Uri getData()

4、Activity的使用
a、定义:

定义一个类extends Activity并重写生命周期方法

在功能清单文件当中使用注册

b、启动

最后

其实要轻松掌握很简单,要点就两个:

  1. 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
  2. 多练。 (视频优势是互动感强,容易集中注意力)

你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

阿里P7Android高级教程

下面资料部分截图,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。

[外链图片转存中…(img-j6ETKLWZ-1714799626785)]

附送高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、近期面试跳槽、自身职业规划迷茫的朋友们。

Android核心高级技术PDF资料,BAT大厂面试真题解析;
[外链图片转存中…(img-SidNsfLV-1714799626785)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值