Android基础知识

Android学习笔记之Activity

2018-10-19  本文已影响2人  sssssss_

1、生命周期全解析

1.典型情况下的Activity生命周期:

2、Activity生命周期的切换过程

3、onStart()和onResume()、onPause()和onStop()的区别:

4、Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个Dialog呢?

5、谈谈onSaveInstanceState()方法?何时会调用?/ 在Activity中如何保存/恢复状态?

//MainActivity 中添加代码进行临时保存
protected void onSaveInstanceState(Bundle outState){
    super.onSaveInstanceState(outState);
    String tempData = "123";
    outState.putString("data_key","tempData");
}
//MainActivity的onCreate()方法中修改如下:
protected void onCreate(Bundle saveInstanceState){
    ...
    if(saveInstanceState != null){
        String tempData = savedInstanceState.getString("data_key");
    }
}

6、Activity异常情况下生命周期分析

可在AndroidManifest.xml中对应的Activity中设置android:configChanges = "orientation|keyboardHidden|screenSize"。此时再次旋转屏幕时,该Activity不会被系统杀死和重建,只会调用onConfigurationChanged。因此,当配置程序需要响应配置改变,指定configChanges属性,重写onConfigurationChanged方法即可。

7、Activity 启动模式LaunchMode

8、IntentFilter匹配规则

9、Activity的四种状态:

10、Activity之间的通信方式

11、Activity上有 Dialog 时按Home键的生命周期

12、Activity与Fragment之间生命周期比较

13、Activity 进程优先级

14、scheme 跳转协议

scheme 是一种页面跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app的各个页面;通过scheme 协议,服务器可以定制化告诉App跳转哪个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面。

15、快速退出所有Activity(关闭多个Activity)?

1、记录打开的Acitivity,只需要用一个专门的收集类对所有的活动进行管理就可以了,新建 ActivityCollector 类作为活动管理器。在BaseActivity中的onCreate方法中调用 ActivityCollector.addActivity(this);即可

public class ActivityCollector{
    public static List<Activity>activities = new ArrayList<>();
    public static void addActivity(Activity activity){
    activities.add(activity);
    }
    public static void remoeActivity(Activity activity){
    activities.remove(activity);
    }
    public static void finishAll(){
        for(Activity activity : activities){
            if(!activity.isFinishing()){
                activity.finish();
            }
        }
        activities.clear();
    }
}

2、发送特定广播,需要结束应用时,给每个Activity收到广播后,关闭即可。

3、递归退出,在打开新的 Activity 时使用 startActivityForResult,然后自己加标志,在 onActivityResult 中处理,递归关闭。

4、通过 intent 的 flag 来实现 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一个新的 activity。此时如果该任务栈中已经有该 Activity,那么系统会把这个 Activity 上面的所有 Activity 干掉。其实相当于给 Activity 配置的启动模式为 SingleTop。

16、如何将一个Activity设置成窗口样式

只需要给我们的 Activity 配置如下属性即可。
android:theme="@android:style/Theme.Dialog"

17、gravity 和 layout_gracity 的区别

18、Android 中的 Context, Activity,Appliction 有什么区别?

相同:Activity 和 Application 都是 Context 的子类。

Context 从字面上理解就是上下文的意思,在实际应用中它也确实是起到了管理上下文环境中各个参
数和变量的作用,方便我们可以简单的访问到各种资源。

不同:维护的生命周期不同。 Context 维护的是当前的 Activity 的生命周期,Application 维护
的是整个项目的生命周期。

使用 context 的时候,小心内存泄露,防止内存泄露,注意一下几个方面

  1. 不要让生命周期长的对象引用 activity context,即保证引用 activity 的对象要与 activity 本身
    生命周期是一样的。
  2. 对于生命周期长的对象,可以使用 application,context。
  3. 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致
    的生命周期变化。

19、Context 是什么?

20、launchMode之singleTask与taskAffinity

taskAffinity是用来指示Activity属于哪一个Task的。taskAffinity能够决定以下两件事情(前提是Activity的launchMode为singleTask或者设置了FLAG_ACTIVITY_NEW_TASK),默认情况下,在一个app中的所有Activity都有一样的taskAffinity,但是我们可以设置不同的taskAffinity,为这些Activity分Task。甚至可以在不同的app之中,设置相同的taskAffinity,以达到不同app的activity公用同一个Task的目的。

21、Activity的布局文件是如何被加载的呢?

22、如何启动其他应用的Activity?

思路:可从隐式Intent角度出发

在保证有权限访问的情况下,通过隐式Intent进行目标Activity的IntentFilter匹配,原则是:

23、Activity的启动过程?

调用startActivity()后经过重重方法会转移到ActivityManagerService的startActivity(),并通过一个IPC回到ActivityThread的内部类ApplicationThread中,并调用其scheduleLaunchActivity()将启动Activity的消息发送并交由Handler H处理。Handler H对消息的处理会调用handleLaunchActivity()->performLaunchActivity()得以完成Activity对象的创建和启动。

本文参考资料:

上一篇下一篇

猜你喜欢

热点阅读