美文网首页
Android基础知识:Activity(5)更多知识

Android基础知识:Activity(5)更多知识

作者: JYangkai | 来源:发表于2018-12-25 14:12 被阅读0次

圣诞节快乐

祝大家圣诞节快乐,希望大家都能和自己最爱的人在一起过圣诞节

又到了听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一些相关的知识。

相关文章

网友评论

      本文标题:Android基础知识:Activity(5)更多知识

      本文链接:https://www.haomeiwen.com/subject/vdtbkqtx.html