活动
1.日志文件概述
使用Android中的日志工具Log
- Log.v() 用于打印那些最为琐碎的、意义最小的日志信息。对应级别verbose,是 Android日志里面级别最低的一种。
- Log.d() 用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的。 对应级别debug,比verbose高一级
- Log.i() 用于打印一些比较重要的数据,这些数据应该是你非常想看到的、可以帮你分 析用户行为数据。对应级别info,比debug高一级
- Log.w() 用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修 复一下这些出现警告的地方。对应级别warn,比info高一级
- Log.e() 用于打印程序中的错误信息,比如程序进入到了catch语句当中。当有错误信息 打印出来的时候,一般都代表你的程序出现严重问题了,必须尽快修复。对应级别error, 比warn高一级。
为什么使用Log而不使用System.out
System.out的缺点:比如日志打印不可控制、打印时间无法确定、不能 添加过滤器、日志没有级别区分……
2.活动概述
活动(Activity)是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用 户进行交互。一个应用程序中可以包含零个或多个活动,但不包含任何活动的应用程序很少见
3.活动的基本用法
活动的一些基本概念
现在右击com.example.activitytest包→New→Activity→Empty Activity,会弹出一个创建活动的对话框,我们自己设置一下活动名称和对应的布局文件名称就完成了一个活动文件的创建。
完成创建活动之后Audio Studio会自动继承appCompatActivity并**重写onCreate()方法
在Android 10版本中,一个活动如果需要使用它,还需要再Manifest文件中注册这个文件,否则活动将不能被使用。
<activity android:name=".FirstActivity"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
以上是一个活动的注册代码,其中intent-filter中的两段代码主要是将此Activity设置为程序的入口(运行此app后首先进入的界面)。
注意
自动创建的xml布局文件为约束布局。
约束布局
对于一些看起来相对较为复杂的布局文件,为了防止嵌套过多导致的活动加载速度较慢,功耗过大。Google公司于2016年发布了约束布局,这个控件需要Android Studio2.2Preview支持可视化编辑工具。约束布局属于可视化的布局,上手相对来说更简单。
在活动中使用Menu(略)
主要完成了在app下边栏中显示菜单按钮
销毁一个活动
finish()方法可以销毁当前活动(一般用于跳转完成之后)
// 通常情况下的调用情况
// 需要让主类继承点击接口,然后重写onClick(View v)方法
@Override
public void onClick(View v) {
finish();
}
button_name.setOnClickListener(this);
4.使用Intent
4.1 使用显示Intent
Intent有多个构造函数的重载,其中一个是Intent(Context packageContext, Class cls) 。
这个构造函数接收两个参数。
- 第一个参数Context 要求提供一个启动活动的上下文
- 第二个参数Class 则是指定想要启动的目标活动。
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
4.2 使用隐式Intent
隐式Intent则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指 定了一系列更为抽象的action 和category 等信息,然后交由系统去分析这个Intent,并帮我 们找出合适的活动去启动。
修改Manifest文件中的Activity的intent-filter标签,可以指定当前活动能够响应的action和category
<activity android:name=".SecondActivity" >
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
然后修改Activity中的按钮的点击事件
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
}
});
注意
显示调用和隐式调用Intent属于对Intent构造函数的重载
4.3 花式使用Intent对象
// 使用Intent借用系统浏览器打开百度
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});
5.向下一个Activity传递数据
在启动活动时传递数据的思路很简单,Intent中提供了一系列putExtra() 方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据再从Intent中取出就可以了。
- 由此可见Activity中自带了一个intent对象来存储数据
5.1 发送数据
// 向下一个Activity发送数据
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent);
}
});
5.2 接收数据
// 另一个Activity接受响应数据信息并打印
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity", data);
}
}
6.活动的生命周期
掌握活动的生命周期很重要。因为当你深入理解活动的生命周期之 后,就可以写出更加连贯流畅的程序,你的应用程序将会拥有更好的用户体验。
6.1 Android 活动的机制
其实Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合, 这个栈也被称作返回栈(Back Stack)。栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新的活动,它会在返回栈中入栈,并处于栈顶的位置。而每当我们按下Back键或调用finish() 方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。
6.2 活动的状态
- 运行状态
当一个活动位于返回栈的栈顶时,这时活动就处于运行状态。系统最不愿意回收的就是处 于运行状态的活动,因为这会带来非常差的用户体验。
- 暂停状态
当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态。你可能会觉 得既然活动已经不在栈顶了,还怎么会可见呢?这是因为并不是每一个活动都会占满整个屏幕的,比如对话框形式的活动只会占用屏幕中间的部分区域,你很快就会在后面看到这 种活动。处于暂停状态的活动仍然是完全存活着的,系统也不愿意去回收这种活动(因为 它还是可见的,回收可见的东西都会在用户体验方面有不好的影响),只有在内存极低的 情况下,系统才会去考虑回收这种活动。
- 停止状态
当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。系统仍然会 为这种活动保存相应的状态和成员变量,但是这并不是完全可靠的,当其他地方需要内存时,处于停止状态的活动有可能会被系统回收。
- 销毁状态
当一个活动从返回栈中移除后就变成了销毁状态。系统会最倾向于回收处于这种状态的活动,从而保证手机的内存充足。
6.3 活动的生存期
Activity类定义了7个回调方法,覆盖了活动生命周期的每一个环节
-
onCreate():这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如说加载布局、绑定事件等。 -
onStart():这个方法在活动由不可见变为可见的时候调用。 -
onResume():这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态。 -
onPause():这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。 -
onStop():这个方法在活动完全不可见的时候调用。它和onPause() 方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause() 方法会得到执行, 而onStop() 方法并不会执行。 -
onDestroy():这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。 -
onRestart():这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
6.4 一些相关概念
- 完整生存期:活动在
onCreate()方法和onDestroy()方法之间所经历的,就是完整生存期。一般情况下,一个活动会在onCreate()方法中完成各种初始化操作,而在onDestroy()方法中完成释放内存的操作。 - 可见生存期:活动在
onStart()方法和onStop()方法之间所经历的,就是可见生存 期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法,合理地管理那些对用户可见的资源。比如在onStart()方法中对资源进行加载,而在onStop()方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。 - 前台生存期:活动在
onResume()方法和onPause()方法之间所经历的就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行交互的, 我们平时看到和接触最多的也就是这个状态下的活动。
6.5 活动被回收的数据处理
前面我们已经说过,当一个活动进入到了停止状态,是有可能被系统回收的。
eg.MainActivity中有一个文本输入框,现在你输入了一段文字,然后启动NormalActivity,这时MainActivity由于系统内存不足被回收掉,过了一会你又点击了Back键回到MainActivity,你会发现刚刚输入的文字全部都没了,因为MainActivity被重新创建了。如果我们的应用出现了这种情况,是会严重影响用户体验的,所以必须要想想办法解决这个问 题。
6.5.1 保存数据在Activity的bundle中
onSaveInstanceState() 方法会携带一个Bundle 类型的参数,Bundle 提供了一系列的方 法用于保存数据,比如可以使用putString() 方法保存字符串,使用putInt() 方法保存整 型数据,以此类推。每个保存方法需要传入两个参数,第一个参数是键,用于后面从Bundle 中取值,第二个参数是真正要保存的内容。
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key", tempData);
}
6.5.2 从bundle中取出数据
onCreate() 方法其实也有一个Bundle 类型的参数。这个参数在一般情况下都是null ,但是如果在活动被系统回收之前有通过onSaveInstanceState() 方法来保存数据的话, 这个参数就会带有之前所保存的全部数据。
736



被折叠的 条评论
为什么被折叠?



