第一行代码-第二版(郭霖著)笔记二(Activity)

article/2025/9/17 8:20:57

目录

一、Activity的用法

1.Activity

2.Toast

3.菜单

4.销毁一个活动

二、Intent

1.使用显示Intent

2.使用隐式Intent

3.更多隐式Intent的用法

4.向下一个活动传递数据

5.返回数据给上一个活动 

 三、活动的生命周期

1.返回栈

2.活动的四种状态

3.活动的生存期

4.体验活动的生命周期

5.活动被回收了怎么办

四、活动的启动模式

五、活动的最佳实践

1.知晓当前是在哪一个活动

2.随时随地退出程序

3.启动活动的最佳写法


一、Activity的用法

1.Activity

任何活动都应该重写Activity的onCreate()方法

项目中在res添加任何资源都会在R文件生成一个相应的资源id

所有的活动都要在AndroidManifest.xml中进行注册才能生效

<activityandroid:name=".FirstActivity"android:label="This"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter>
</activity>

android:label="This"  : 指定活动标题栏的内容,并且会成为启动器(Launcher)中应用程序显示的名称

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.first_layout);
}

setContentView(R.layout.first_layout); : setContentView()表示给当前活动加载一个布局 


2.Toast

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.first_layout);Button button1 = (Button)findViewById(R.id.button_1);button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(FirstActivity.this, "你点击了Button 1", Toast.LENGTH_SHORT).show();}});
}

FirstActivity.this : 此处要求是一个Context对象。通过查看源码可知 FirstActivity继承Activity,Activity最后继承Context

3.菜单

创建menu文件夹,并且在文件夹下创建Menu resource file

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/add_item"android:title="Add" /><itemandroid:id="@+id/remove_item"android:title="Remove" />
</menu>
public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main,menu);return true;
}

该方法用于给当前活动创建菜单 

getMenuInflater()是父类AppCompatActivity的方法,在继承父类的方法内调用父类的方法时,this可以省略。

返回true表示允许创建的菜单显示出来,返回false表示创建的菜单将无法显示

public boolean onOptionsItemSelected(@NonNull MenuItem item) {switch (item.getItemId()){case R.id.add_item:Toast.makeText(this, "你点击了add", Toast.LENGTH_SHORT).show();break;case R.id.remove_item:Toast.makeText(this, "你点击了remove", Toast.LENGTH_SHORT).show();break;default:}return true;
}

该方法定义菜单响应事件 


4.销毁一个活动

在活动中直接调用finish()方法可以销毁当前活动

finish()方法其实是MainActivity.this.finish();或者MainActivity.super.finish();

二、Intent

可用于启动活动、启动服务和发送广播等场景

1.使用显示Intent

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

startActivity(intent)是Activity的方法,这里其实就是MainActivity.this.startActivity(intent); 或者MainActivity.super.startActivity(intent);

第一个参数Context要求提供一个启动活动的上下文,第二个参数指定想要启动的目标活动

2.使用隐式Intent

<activity android:name=".SecondActivity"><intent-filter><action android:name="com.jack.test0712.START_ACTION"/><category android:name="android.intent.category.DEFAULT"/></intent-filter>
</activity>

"android.intent.category.DEFAULT" : 这是一种默认的catagory,调用startActivity()方法时会自动将这个category添加到Intent中 

<activity>标签下配置<intent-filter>的内容,只有<action>和<category>中的内容同时匹配Intent中指定的action和category时,活动才能响应该Intent 

每个Intent中只能指定一个action,但能指定多个category

Intent intent = new Intent("com.jack.test0712.START_ACTION");
intent.addCategory("com.jack.test0712.MY_CATEGORY");
startActivity(intent);
<activity android:name=".SecondActivity"><intent-filter><action android:name="com.jack.test0712.START_ACTION"/><category android:name="android.intent.category.DEFAULT"/><category android:name="com.jack.test0712.MY_CATEGORY"/></intent-filter>
</activity>

3.更多隐式Intent的用法

使用隐式Intent启动其他程序的Activity:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.baidu.com"));
startActivity(intent);

Intent.ACTION_VIEW : Android系统的内置动作,其常量值为android.intent.action.VIEW 

<intent-filter>标签里可以再配置一个<data>标签,指定当前活动可以响应什么类型的数据

<activity android:name=".ThirdActivity"><intent-filter tools:ignore="AppLinkUrlError"><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><data android:scheme="https"/></intent-filter>
</activity>

4.向下一个活动传递数据

String data ="你好,二活动";
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);

putExtra()方法可以将数据暂存在Intent中,第一个参数是键,第二个参数是传递的数据 

Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);

传递的数据是String,使用getStringExtra()方法;整形数据使用getIntExtra()方法;布尔型数据使用getBooleanExtra()方法

5.返回数据给上一个活动 


 三、活动的生命周期

1.返回栈

栈是一种后进先出的数据结构,活动组成的集合(又称任务)就放在返回栈中

2.活动的四种状态

运行状态
暂停状态
停止状态
销毁状态

3.活动的生存期

onCreate():活动第一次被创建的时候调用
onStart():活动由不可见变为可见的时候调用
onResume():活动处于栈顶运行状态,准备和用户交互的时候调用
onPause():系统准备去启动或恢复另一个活动时调用
onStop():活动完全不可见的时候调用
onDestroy():活动被销毁的时候调用
onRestart():活动由停止状态变为运行状态的时候调用

活动的三个生存期:

完整生存期:活动在onCreate()和onDestroy()之间所经历的
可见生存期:活动在onStart()和onStop()之间所经历的
前台生存期:活动在onResume()和onPause()之间所经历的


 

4.体验活动的生命周期

<activity android:name=".DialogActivity" android:theme="@style/Theme.AppCompat.Dialog"></activity>

给当前活动指定对话框式主题

5.活动被回收了怎么办

Activity提供了一个onSaveInstanceState()回调方法,该方法在活动被回收的时候调用,该方法携带了Bundle类型的参数
Bundle有putString()方法用于保存字符串,putInt()方法用于保存整型数据
也有getString()方法用于取出字符串数据,以此类推

四、活动的启动模式

通过<activity>标签指定android:launchMode属性选择启动模式

1.standard

每次启动都会创建该活动的一个新的实例

this.toString():当前活动的实例

2.singleTop

启动活动时如果发现返回栈的栈顶已经是该活动,则直接使用它,不会创建新的实例

3.singleTask

启动活动时系统会在返回栈检查是否存在该活动的实例,如果发现存在则直接使用该实例,并把该活动之上的所有活动统统出栈

4.singleInstance

指定为singleInstance的活动会启用一个新的返回栈来管理此活动,解决其他应用程序共享活动实例的问题

getTaskId():当前返回栈的id

五、活动的最佳实践

1.知晓当前是在哪一个活动

新建一个类继承AppCompatActivity,重写onCreate()方法,添加Log.d("类的名字",getClass().getSimpleName()),再让所有的活动类继承这个类,通过Log就会打印出当前实例的类名

2.随时随地退出程序

新建一个专门的集合类对所有的活动进行管理

3.启动活动的最佳写法

在每一个活动类中添加一个静态启动方法,方法的参数是Context和需要传递的数据


http://chatgpt.dhexx.cn/article/pGHjpED5.shtml

相关文章

android动态权限依赖库,动态申请app权限:郭霖大神的PermissionX库带你告别原生

引言 为什么那么多人想要自定义Android的权限申请PermissonX?因为PermissionX默认的权限提醒弹出实在是太丑了!而且,需要在你需要提醒用户弹出Dialog时,显得捉襟见肘,你可能就在想有没有一款能封装进去Dialog提醒用户,具有超棒的用户体验,还能看起来美观大气的Permissio…

跟随郭霖学Volley

volley 下载导入volleyjar 学习地址: https://blog.csdn.net/guolin_blog/article/details/17482095 2013在Google I/O大会提出 github地址: https://github.com/google/volley 下载volley导入到as 具体的操作是: project模式下 具体看图: 之后的操作是打开lib 选择jar 右…

android 6.0权限 郭霖,Permission——郭霖认为最优的运行时权限方案

Android6.0发布这么久&#xff0c;对运行时权限也看了很多资料&#xff0c;对比过几个流行的库。但是个人还是喜欢在项目里用自己动手封装的东西&#xff0c;哪怕照抄也好。。。不知道是什么原因。 前天无意听郭神的直播。讲解的是运行时权限的封装&#xff0c;收益颇多。依样画…

郭霖LitePal

由于项目需要开始学习sqlite 一开始先学习使用的是 android ormlite 操作 从最基本的建表增删改查一路走来 磕磕碰碰很多 都是在内存中操作sqlite 只能通过sqlitestudio工具进行查看 不能导出 并且应用卸载数据表就丢失 最终考虑在sd卡中操作sqlite 但是ormlite 并没有这方面…

android郭霖博客,Runtime Permissions(郭霖CSDN公开课)

运行时权限 Api23开始&#xff0c;Android权限机制更改&#xff0c;有一部分权限不再是简单的在AndroidManifest.xml中声明即可。而是需要在运行时让用户去选择是否允许该项权限的操作。 那么哪些权限需要在运行时申请呢&#xff1f;危险权限需要这么做&#xff0c;而普通权限仍…

看一看Facebook工程师是怎么评价《第一行代码》的

本文同步发表于我的微信公众号&#xff0c;扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注&#xff0c;每个工作日都有文章更新。 大家好&#xff0c;我是一名Facebook的工程师&#xff0c;同时也是《第一行代码——Android》的忠实读者。 虽然我最近几年是在国外读书和工…

郭霖:手把手教你实现 App 360 度旋转看车效果

这是郭神号前阵子的推送&#xff0c;应该有不少人还没有看过&#xff0c;现在分享给大家&#xff0c;希望对大家的Android工作和学习有所帮助。 / 作者简介 / 本篇文章来自Youth Lee的投稿&#xff0c;分享了他自己结合Glide写的一个控件&#xff0c;希望对大家有所帮助&#…

第一行代码-第二版(郭霖著)笔记(初识Android)

系列文章目录 第一章 第一行代码-第二版&#xff08;郭霖著&#xff09;笔记&#xff08;初识Android&#xff09; 目录 一、Android简介 1.android系统架构 2.Android应用开发特色 二、工具准备 Tips:新建项目的时候是否勾选use legacy android.support libraries 三、…

专访郭霖:成长无止境

留意文末赠书活动 嘉宾 | 郭霖 文 | 张霞 郭霖&#xff0c;Android开发工程师&#xff0c;Android GDE&#xff08;Google认证开发者专家&#xff09;。从事Android开发工作9年&#xff0c;有着丰富的项目实战经验&#xff0c;负责及参与开发过多款移动应用与游戏&#xff0c;开…

解决http响应状态为canceled

最近写登录的页面&#xff0c;发现通过ajax请求后台的时候&#xff0c;监控台返回该请求的状态是canceled。 原因 仅仅是由于之前为了在输入账号时让浏览器进行自动补全&#xff0c;而将原先的div更换为了form,而不巧的是之前的登录事件源使用的是button。 而至于为什么stat…

ajax请求导致status为canceled的原因

在使用layui的form表单提交以后&#xff0c;请求状态总是canceled。后来在form表单的后面添加了一行代码&#xff1a; return false; 就可以了。 文档&#xff1a;https://www.layui.com/doc/modules/form.html#onsubmit 错误&#xff1a; 解决方法&#xff1a; 总结一下&…

ajax请求文件状态为 canceled 的解决办法

ajax请求文件状态为 canceled 的解决办法 场景还原原因分析解决 场景还原 最近做一个表单提交的需求时&#xff0c;遇到了这种情况&#xff0c;输完账号密码后回车提交&#xff0c;报错&#xff0c;f12打开看到是请求的status为canceled了&#xff0c;震惊一秒钟。。。如下图&…

chrome同步或登录报错:Request Canceled

原因 因为某个接口连接失败造成&#xff0c;可以摁快捷键F12或者点击开发者工具。 然后选择network&#xff0c;这里面是该页面所有的收发请求 开始登录&#xff0c;登录的时候要注意network中pending或者报错的接口&#xff0c;然后把域名记录下来 解决方式 安装chrome插…

http发送请求,status显示canceled的原因

原因&#xff1a;onSubmit和submit属性比较陈旧&#xff0c;在提交了数据以后会自动刷新页面&#xff0c;导致信息丢失以及请求中止 解决&#xff1a;在 handler里面写入e.preventDefault();阻止onsubmit执行默认的刷新页面行为。

使用 npm create vue@3 报错 npm ERR! canceled

问题 之前运行都可以成功创建&#xff0c;但今天运行 npm create vue3 的时候报错了&#xff0c;错误信息如下&#xff1a; 解决方法 在网上找了一堆方法都无效。 npm 版本问题&#xff0c;升级到最新版本 npm i -g npm&#xff0c;然后重试 npm create vue3 【x】npm cac…

Go:read一个已经被canceled的http.Request的应答

Go&#xff1a;read一个已经被canceled的http.Request的应答 1.复现 最近发现项目在处理chunk类型的http应答时&#xff0c;出现读数据异常报错&#xff0c;代码示例如下&#xff1a; server package mainimport ("bytes""net/http" )func main() {http…

Idea通过git拉取代码的时候出现Update canceled问题

当在IDEA中通过Git更新代码时&#xff0c;拉取失败&#xff0c;报如下错误 12:31 Update failedInvocation failed Server returned invalid Response.java.lang.RuntimeException: Invocation failed Server returned invalid Response.at git4idea.GitAppUtil.sendXmlRequest…

Xmodem operation was canceled by remote peer问题已解决

1.Xmodem operation was canceled by remote peer. 传输的时候就会出现注意的问题 2.使用df -h命令查看内存状况&#xff0c;可以发现root已经满了。 3.进入根目录&#xff0c;ls显示&#xff0c;使用rm命名将其中的文件删除 4.显示&#xff0c;可以看见内存占用变少。 5.…

vue proxy发出的post请求出现超时导致的canceled

0 问题 vue的proxy代理好了之后&#xff0c;get请求没问题&#xff0c;post请求出现canceled&#xff0c;如下图所示&#xff1a; 解决方案 参考 https://github.com/chimurai/http-proxy-middleware/issues/40 devServer: {host: 0.0.0.0,port: 8085,proxy: {/api: {targ…

IDEA中git拉取代码的时出现Update canceled问题

IDEA中git拉取代码的时出现Update canceled问题 当在IDEA中通过Git更新代码时&#xff0c;拉取失败&#xff0c;报如下错误 解决办法&#xff1a; 勾选上以后&#xff0c;点击 OK 后拉取代码&#xff1b; 然后就成功了