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![在这里插入图片描述](https://img-blog.csdnimg.cn/20201228223258182.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzU3MDM0,size_16,color_FFFFFF,t_70)
点击界面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、启动
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
特定接口或继承特定类
需要在配置文件中配置其全类名
它的对象不是通过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、启动
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-ZG7sX1Wo-1715419774803)]
[外链图片转存中…(img-vxsrYKzu-1715419774804)]
[外链图片转存中…(img-2JlG1IEY-1715419774805)]
[外链图片转存中…(img-6ALiRRFP-1715419774805)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!