1、对话框活动
DialogActivity 的注册代码有些不同,它使用了一个 android:theme 属性,这是用于给当前活动指定主题的,Android 系统内置有很多主题可以选择,当然我们也可以定制自己的主题,而这里@android:style/Theme.Dialog 则毫无疑问是让 DialogActivity 使用对话框式的主题。
<activity android:name=".NormalActivity" ></activity> <activity android:name=".DialogActivity" android:theme="@android:style/Theme.Dialog" ></activity>
2、活动被回收(stop)前保存离线数据
onSaveInstanceState()方法会携带一个 Bundle 类型的参数
活动被回收后,再次进入会再次进入oncreate()方法
在 MainActivity 中添加如下代码就可以将临时数据进行保存:
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); String tempData = "Something you just typed"; outState.putString("data_key", tempData); }
数据是已经保存下来了,那么我们应该在哪里进行恢复呢?其实我们一直使用的 onCreate()方法其实也有一个 Bundle 类型的参数。这个参数在一般情况下都是null,但是当活动被系统回收之前有通过 onSaveInstanceState()方法来保存数据的话,这个参数就会带有之前所保存的全部数据,我们只需要再通过相应的取值方法将数据取出即可。
修改 MainActivity 的 onCreate()方法,如下所示:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); if (savedInstanceState != null) { String tempData = savedInstanceState.getString("data_key"); Log.d(TAG, tempData); } …… }
取出值之后再做相应的恢复操作就可以了,比如说将文本内容重新赋值到文本输入框
3、活动启动模式:
活动activity中配置android:launchMode=""
standard
(默认的启动模式)
每次启动都创建该活动的一个新的实例放入栈顶
singleTop
启动时,若发现栈顶已经是该活动,则直接使用不再创建
若该活动不在栈顶,则仍需新建
singleTask
(让某个活动在整个应用程序的上下文中只存在一个实例)
启动时,检查栈中是否有该活动,有则直接使用(onRestart()),并将其上的所有活动出栈(onDestroy())
其他活动onDestory(),该活动onRestart();
singleInstance
(指定为 singleInstance 模式的活动会启用一个新的返回栈来管理这个活动)
场景:程序中的一个活动允许其他活动调用,其他程序和我们的程序共享该活动的实例
每个应用程序都有自己的返回栈,同一活动在不同的返回栈中入栈必然会创建新的实例,该模式可以解决这个问题。
该模式下会有一个单独的返回栈来管理这个活动,不论哪个程序来访问这个活动,都公用同一个返回栈。
singleInstance:
按下 Back 键进行返回,你会发现 ThirdActivity 竟然直接返回到了 FirstActivity,再按下 Back 键又会返回到 SecondActivity,再按下 Back 键才会退出程序,这是为什么呢?
其实原理很简单,由于 FirstActivity 和 ThirdActivity 是存放在同一个返回栈里的,当在ThirdActivity 的界面按下 Back 键,ThirdActivity 会从返回栈中出栈,那么 FirstActivity 就成
为了栈顶活动显示在界面上,因此也就出现了从 ThirdActivity 直接返回到 FirstActivity 的情况。然后在 FirstActivity 界面再次按下 Back 键,这时当前的返回栈已经空了,于是就显示了
另一个返回栈的栈顶活动,即 SecondActivity。最后再次按下 Back 键,这时所有返回栈都已经空了,也就自然退出了程序。
Android栈:
1.一个应用程序一般都是由多个activity组成的。
2.任务栈(task stack)(别名back stack后退栈) 记录存放用户开启的activity的。
3.一个应用程序一被开启系统就给他分配一个任务栈,当所有的activity都退出的时候,任务栈就清空了。
4.任务栈的id是一个integer的数据类型 自增长的。
5.在android操作系统里面会存在多个任务栈,一个应用程序一个任务栈。
6.桌面应用和一般的应用程序是一样的,任务栈的行为也是一样。
7.默认情况下, 关闭掉一个应用程序,清空了这个应用程序的任务栈。应用程序的进程还会保留。
Android用栈存放activity
启动一个新的活动,入栈,并处于栈顶。
销毁一个活动时,栈顶活动出栈。
系统总是会显示处于栈顶的活动给用户,即栈顶活动可见。
4、活动状态:
1、运行
一个活动位于栈顶时,这活动处于运行状态。
2、暂停
一个活动不处于栈顶位置,但仍然可见时,这活动处于暂停状态。活动完全存活着。(比如栈顶活动为对话框形式)
3、停止
一个活动不处于栈顶位置,且完全不可见,这活动处于停止状态。(还在栈中)
4、销毁
一个活动从栈中移除后,这活动处于销毁状态。
activity的生存期
1. onCreate()
活动第一次被创建的时候调用,在该方法中完成初始化操作,加载布局、绑定事件等。
2. onStart()
由不可见变为可见的时候调用。(非栈顶到栈顶)
3. onResume()
在活动准备好和用户交互的时候调用。(栈顶)
4. onPause()
准备去启动或恢复另一个活动时调用。
5. onStop()
在活动完全不可见时调用。
6. onDestroy()
在活动被销毁前调用。完成释放内存操作。
7. onRestart()
在活动由停止状态变为运行状态前调用。
除onRestart()外,其他两两对应,活动分为三种生存期:
1. 完整生存期
onCreate()和onDestroy()之间所经历的,就是完整生存期。
2. 可见生存期
onstart()和onStop()之间所经历的,就是可见生存期。
3. 前台生存期
onResume()和onPause()之间所经历的,就是可见生存期。
5、活动跳转
activity1:
传递参数:
Intent intent = new Intent(MainActivity.this , SecondActivity.class); intent.putExtra("welcome","Hello world !"); intent.putExtra("isTrue",true); intent.putExtra("int2",11); //startActivity(intent); startActivityForResult(intent,1);
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 1: if (resultCode == RESULT_OK) { String returnedData = data.getStringExtra("data_return"); Log.d("FirstActivity", returnedData); } break; default: } }
activity2:
接收:
Intent intent = getIntent(); String data = intent.getStringExtra("welcome");
回传:
Intent intent = new Intent(); intent.putExtra("data_return", "Hello FirstActivity"); setResult(RESULT_OK, intent); //在setResult后,要调用finish()销毁当前的Activity,否则无法返回到原来的Activity finish();
活动跳转的另一方法(启动活动的最佳写法)
可方便知悉需要传递的参数
常规方法:
Intent intent = new Intent(FirstActivity.class,SecondActivity.class); intent.putExtra("param1",data1); intent.putExtra("param2",data2); startActivity(intent);
该方法在SecondActivity中接收参数时,若不了解SecondActivity中需要的参数,就会很不方便。
改良方法:
MainActivity中这样传递参数:
SecondActivity.actionStart(MainActivity.this,"11","22");
SecondActivity中:
public class SecondActivity extends BaseActivity { /*自定义方法*/ public static void actionStart(Context context,String data1,String data2){ Intent intent = new Intent(context,SecondActivity.class); intent.putExtra("param1",data1); intent.putExtra("param2",data2); context.startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second_layout); Intent intent = getIntent(); Log.d("SecondActivity","data1:"+intent.getStringExtra("param1")+",data2:"+intent.getStringExtra("param2")); } }
6、知晓当前是哪个活动
public class BaseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityCollector.addActivity(this); //在BaseActivity的onCreate()方法中添加: Log.d("BaseActivity",getClass().getSimpleName()); } @Override protected void onDestroy() { super.onDestroy(); ActivityCollector.removeActivity(this); } }
然后让 BaseActivity 成为项目中所有活动的父类。
7、随时随地退出程序:
自定义一个活动管理器ActivityCollector
public class ActivityCollector { private static List<Activity> ls = new ArrayList<Activity>(); public static void addActivity(Activity activity){ ls.add(activity); } public static void removeActivity(Activity activity){ ls.remove(activity); } public static void finishAll(){ for(Activity activity : ls){ if(!activity.isFinishing()){ activity.finish(); } } } } //BaseActivity中调用: public class BaseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Log.d("BaseActivity", getClass().getSimpleName()); ActivityCollector.addActivity(this); } @Override protected void onDestroy() { super.onDestroy(); ActivityCollector.removeActivity(this); } }
8、全局Context
Android 提供了一个 Application 类,每当应用程序启动的时候,系统就会自动将这个类进行初始化。而我们可以定制一个自己的 Application 类,以便于管理程序内一些全局的状态
信息,比如说全局 Context。
public class MyApplication extends Application { private static Context context; @Override public void onCreate() { context = getApplicationContext(); } public static Context getContext() { return context; } }
配置完整包名:
<application android:name="com.example.networktest.MyApplication" …… > …… </application>
获取全局Context使用 MyApplication.getContext() 即可。
9、Intent传递复杂对象
Serializable 方式
//对象序列化: public class Person implements Serializable{ private String name; private int age; //get/set... } //传递 Person person = new Person(); person.setName("Tom"); person.setAge(20); Intent intent = new Intent(FirstActivity.this, SecondActivity.class); intent.putExtra("person_data", person); startActivity(intent); //接收: Person person = (Person) getIntent().getSerializableExtra("person_data");
Parcelable 方式 Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是
Intent 所支持的数据类型,这样也就实现传递对象的功能了。
public class Person implements Parcelable { private String name; private int age; …… @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); // 写出name dest.writeInt(age); // 写出age } public static final Parcelable.Creator<Person> CREATOR = new Parcelable. Creator<Person>() { @Override public Person createFromParcel(Parcel source) { Person person = new Person(); //读取的顺序一定要和刚才写出的顺序完全相同 person.name = source.readString(); // 读取name person.age = source.readInt(); // 读取age return person; } @Override public Person[] newArray(int size) { return new Person[size]; } }; } //接收: Person person = (Person) getIntent().getParcelableExtra("person_data");
。。。
=================================================================================
面试:
1、什么是Activity
通俗一点说Activity就是一个界面,这个界面里面可以放置各个控件。Activity的界面也是用xml表示,放置在res->layout下面。每生成一个新的Activity后,我们需要在AndroidManifest.xml中注册一下这个Activity。
2、请描述一下Activity的生命周期
onCreate(Bundle savedInstanceState):创建Activity时调用,设置在该方法中,还以Bundle的形式提供对以前存储的任何状态的访问。
onStart():activity变为在屏幕上对用户可见时调用
onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个activity,该方法总是被调用)
onPause():activity被暂停或者收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧
onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。
onRestart():重新启动activity时调用,该活动仍在栈中,而不是启动新的activity
onDestroy():activity被完全从系统内存中移除时调用
3、两个Activity之间跳转时必然会执行的是哪几个方法:
onCreate():在activity生命周期开始时调用
onRestoreInstanceState():用来恢复UI状态
onRestart():当activity重新启动时调用
onStart():当activity对用户即将可见时调用
onResume():当activity与用户交互时,绘制界面
onSaveInstanceState():当activity即将移除栈顶保留UI状态时被调用
onPause():暂停当前活动的activity,提交持久数据的改变,停止动画和其他占用CPu资源的东西,由于下一个activity在这个方法返回之前不会resume,所以这个方法的代码执行要快
onStop():activity不再可见时调用
onDestroy():在activity销毁栈时被调用的最后一个方法
4、横竖屏幕切换时候activity的生命周期
①不设置activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,且竖屏时会执行两次
②设置activity的android:configChanges=”orientation"时,切屏还是会调用各个生命周期,切横屏,竖屏时只会执行一次
③设置activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
5、你后台的Activity被系统回收怎么办?
系统会帮我们记录下回收之前Activity的状态,再次调用被回收的Activity就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里面带上参数savedInstanceState,savedInstanceState是一个Bundle对象,基本上可以把它理解为系统帮你维护的一个map对象,使用它可以恢复到回收前的状态
6、如何将一个activity设置为窗口的样式
①在你的style.xml文件中可以新建一如下的类似Dialog的style:
<style name="Theme.FloatActivity" parent="android:style/Theme.Dialog></style>
②在AndroidManifest.xml中在你需要显示为窗口的activity中添加如下属性:
android:theme="@style/Theme.FloatActivity"即可
也可以直接添加对应需要展示为Dialog style的activity的android:theme属性值为:android:theme="@android:style/Theme.Dialog"
8、在同一个程序,但不同的activity中是否可以放在不同的Task任务栈中?
可以放在不同的Task中。需要为不同的activity设置不同的taskaffinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记
相关推荐
在Android开发中,“第一行代码”是一本广受欢迎的入门书籍,作者郭霖通过简洁易懂的方式介绍了Android开发的基础知识。这个练习代码7应该是针对书中第六章内容的实践部分,主要涉及数据持久化这一核心主题。 ...
【标题】"第一行代码Java源代码第8章课程代码Java新特性共"涉及的是Java编程语言的新特性,特别是集中在第8章的学习内容。这部分通常会涵盖Java的最新版本中引入的一些重要改进和功能,旨在提升开发效率和代码质量。...
在学习《信息安全系统设计基础》第一周时,我们设定了学习目标,包括学习5000行代码、编写30篇博客和学习400小时。通过学习,我们可以提高自己的信息安全知识和技能,达到学习目标。 《信息安全系统设计基础》第一...
Android开发是移动应用领域的重要组成部分,掌握其基础知识是成为合格Android开发者的第一步。本文将从快捷键使用、环境配置、UI界面设计等方面进行深入阐述。 一、快捷键操作 快捷键在提高开发效率方面起着至关...
第一章 java 简介.ppt+代码 第二章 java 语言基础1.ppt+代码 第三章 面向对象编程的基本概念.ppt+代码 第四章 java 中的对象、类、包和接口.ppt+代码 第五章 异常处理.ppt+代码 第六章 编写文本应用程序1.ppt+代码 ...
基于谭浩强的面向对象程序设计第二版基础上,进行代码书写学习的,自己总结了很多的内容知识点,都配有讲解和代码,同时代码是在vs2013的环境上编译通过的,总体对于一个初学者学习c++,真的很好,本人觉得,值得一...
总结来说,"PHP6与MySQL5基础教程第三版源代码"是一个宝贵的学习资源,它提供了实践编程知识的平台,帮助读者将理论知识转化为实践经验,从而更好地掌握这两种技术。而09.11.25的更新则确保了学习材料的准确性和可靠...
第一行代码: ```易语言 .请求数据("http://checkip.dyndns.org",0,.响应数据) ``` 这行代码通过HTTP GET方法请求`http://checkip.dyndns.org`这个URL上的数据。`.请求数据`是易语言中的网络函数,用于发送HTTP...
在大数据领域,数据采集是整个流程的第一步,它涉及从各种来源获取原始数据。这些来源可以是日志文件、社交媒体、传感器设备、网络流量等。数据采集通常使用专门的工具,如Flume、Kafka或者Scrapy。Flume是一个...
HTML 基础知识总结的第一天,主要涵盖 HTML 基础语法、标签的分类、网页组成、标签的关系、注释、标题标签、段落标签、换行和水平线、文本格式化标签、图像标签、路径、超链接标签、音频和视频等知识点。 HTML 基础...
了解并掌握这些基本元素是编写C程序的第一步。 二、控制结构 控制结构包括条件语句(if...else、switch...case)和循环语句(for、while、do...while)。它们用于根据特定条件执行不同的代码块,或者重复执行某段...
本教程将介绍如何通过一行代码轻松实现Android视频和音频播放,并实现全屏功能。这个方法适用于各种Android项目,目标是成为Android平台上最简便、最广泛使用的视频播放解决方案。 首先,我们要引入关键的库,...
在实验中,我们将带领大家阅读可能是你人生中的第一份“硬件设计功能描述”(hardware design function specification)文档。这一份 MCDF 功能文档将会贯穿我们整个课程和实验环节,所以同学们务必反复阅读该文档。...
这份"总结iOS开发代码实践总结iOS开发技巧共16页.pdf"的文档,显然是一份宝贵的资源,它涵盖了多个方面的知识点,旨在帮助开发者提升其iOS应用开发技能。以下是基于该文件标题和描述可能包含的一些关键知识点的详细...
本资源"游戏开发技术总结(经典之作)第四集源代码"显然是一个关于游戏开发的深入学习资料,可能包含了一系列教程或案例研究的源代码,帮助开发者理解并掌握核心概念和技术。 首先,我们来看看"游戏类库"。在游戏...
学习Java的第一步是安装Java Development Kit(JDK),设置环境变量PATH和JAVA_HOME,确保能够运行Java编译器javac和解释器java。 3. **基本语法** - **数据类型**: 包括基本数据类型(如int、float、boolean等)...
`这一行代码导致的除零错误。 #### 总结 通过上述方法,即使只有崩溃地址作为线索,也能够在大多数情况下成功定位到源代码中的错误行。这种方法的关键在于正确配置项目以生成包含足够信息的MAP文件,并学会分析...
1. 第一行代码可能是用来枚举屏幕上的所有窗口。易语言提供了“窗口枚举”函数,可以遍历系统中所有可见的窗口。这一步的目的是获取到所有需要处理的窗口句柄。 2. 第二行代码可能涉及到窗口操作,比如调用“窗口...