圣诞节快乐
祝大家圣诞节快乐,希望大家都能和自己最爱的人在一起过圣诞节
又到了听Lonely Christmas的时候,去年圣诞还是在学校,现在我都工作快半年了。
谁又骑着那鹿车飞过,忘掉投下那礼物给我
保存临时数据
Android系统会在内存不足的情况下杀掉后台的一些进程,当我们启动一个app,在app里打开了很多个页面,当某些页面很久不在前台显示也可能被系统回收掉
比如我们在登录页面启动注册页面,由于某些原因我们在注册页面停留的时间比较久,导致系统将登录界面回收,这时我们点击Back键回到登录界面,系统会重新创建一个新的登录Activity实例
这样,我们在登录界面的一些数据就会消失,这对用户来说是体验非常不好的,那有没有什么方法可以解决呢?这个问题问得好,不仅有,而且用法也比较简单,下面我们一起来看看
- onSaveInstanceState
此方法在Activity生命周期回调的onStop方法之前,我们可以在此方法做一些保存数据的操作
我们通过代码来具体学习,重写onSaveInstanceState方法
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt("username",123);
outState.putString("password","qaz123");
super.onSaveInstanceState(outState);
}
我们通过调用Bundle.putXXX方法放数据,方式是key-value,然后再调用super.onSaveInstanceState(outState)方法保存数据,这样在Activity被意外回收时就可以保存用户数据
- onRestoreInstanceState
此方法是在onStart方法后执行
我们也通过代码来具体学习,重写onRestoreInstanceState方法
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
int username=savedInstanceState.getInt("username");
String password=savedInstanceState.getString("password");
}
我们在此方法中通过Bundle.getXXX方法获取对应的数据,传入的参数是key,注意这个key要和onSaveInstanceState中put的一一对应,不然会报错
调用时机:在Activity被系统回收和屏幕方向发生改变,点击Back键和Home键不会调用这两个方法
数据传递
我们在启动Activity的时候需要传入Intent参数,Intent可以在构建成功后传入数据,包括基本数据和自定义的数据类型
我们通过实际代码来学习数据是如何从一个Activity传入另一个Activity
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("username",123);
intent.putExtra("password","qaz123");
startActivity(intent);
我们在构建Intent后,调用Intent.putExtra方法,其支持的数据类型很多,包括基本数据类型、String、ArrayList等等,还支持自定义的数据类型,但自定义的数据类型需要实现Serializable或者Parcelable接口
Intent的更多应用
Intent不仅可以启动本程序的Activity,还可以通过包名和传入一些数据来启动其他程序,比如启动打电话、浏览器、相机等等
我们来学习下Intent是如何启动这些应用的
- 直接打电话
Intent intent=new Intent(Intent.ACTION_CALL);
Uri uri=Uri.parse("tel:10086");
intent.setData(uri);
startActivity(intent);
打电话需要有拨号权限
<uses-permission android:name="android.permission.CALL_PHONE" />
- 打开拨号界面
Intent intent=new Intent(Intent.ACTION_DIAL);
Uri uri=Uri.parse("tel:10086");
intent.setData(uri);
startActivity(intent);
我们可以看到直接拨号和打开拨号界面唯一的区别在于构建Intent时传入的Action
- 打开浏览器
Intent intent=new Intent(Intent.ACTION_VIEW);
Uri uri=Uri.parse("http://www.baidu.com");
intent.setData(uri);
startActivity(intent);
横竖屏切换
当用户启动了系统的自动旋转开关,那么Activity可能就会随屏幕而旋转,具体我们可以通过修改AndroidMainfest.xml文件设置Activity固定横屏或者竖屏
- 固定为竖屏
<activity android:name=".MainActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
- 固定为横屏
<activity android:name=".MainActivity"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
主要是通过设置Activity的android:screenOrientation属性
portrait:竖屏
landscape:横屏
默认情况下,旋转屏幕会导致Activity重新调用各个生命周期
切换横屏会执行一次,切换竖屏会执行两次
如果我们不想Activity重新回调各个生命周期的话,我们也可以通过修改AndroidManifest.xml来设置
<activity android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
此时当手机屏幕横竖屏切换时就只会调用
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
我们可以重写此方法来对横竖屏进行处理,比如加载不同布局文件,改变一些控件的位置等。
重写onBackPressed方法
我们在使用一些app,在退出的时候app会提示你“再按一次退出程序”,其实这个一般都是通过重写onBackPressed方法来实现
@Override
public void onBackPressed() {
super.onBackPressed();
}
onBackPressed方法就是按Back键后的处理
我们通过代码来具体实现“再按一次退出”功能
@Override
public void onBackPressed() {
if (!isRecord) {
isRecord = true;
mLastTime = System.currentTimeMillis();
Toast.makeText(MainActivity.this, "再按一次退出", Toast.LENGTH_SHORT).show();
} else {
if ((System.currentTimeMillis() - mLastTime) < 2000) {
finish();
} else {
mLastTime = System.currentTimeMillis();
Toast.makeText(MainActivity.this, "再按一次退出", Toast.LENGTH_SHORT).show();
}
}
}
代码比较简单、易懂,相信大家看了之后就会明白其中的原理
以上就是Activity一些相关的知识。
网友评论