Activity心得体会

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33706840/article/details/81409274

Activity生命周期

  • onCreate():表示Activity正在被创建,通常做一些Activity所需数据的初始化工作,或者通过setContentView()加载布局资源。
  • onReStart():表示Activity正在重新启动,通常表现为用户通过按Home键或者开启了一个新的Activity然后再回到原来的Activity调用,首先会执行onPauseonStop,变为不可见,然后执行onReStartonResume回到前台界面并变为可见。
  • onStart():表示Activity正在启动,Activity变为可见,存在与后台且无法与用户进行交互。
  • onResume():表示Activity可见,存在于前台界面并可与用户进行交互。
  • onPause():表示Activity正在停止,启动新的Activity时首先调用当前Activity的onPause,然后再掉用启动的Activity的onCreateonStartonResume,然后再调用当前Activity的onStop
  • onStop():表示Activity即将停止,可做一些对用户不可见时不需要的资源处理,比如动画或者更新操作。在此方法中也可执行一些数据保存的操作。
  • onDestroy():表示Activity销毁,通常执行一些资源回收工作。
  • 资源初始化与释放:如果在onStart事件之后初始化某些内容,则在onStop事件之后释放或终止它。如果在onResume事件之后初始化,则在onPause事件之后释放,通过isFinishing判断销毁。

Activity优先级

Activity优先级排序:

  • 前台Activity——正在进行交互的Activity。
  • 可见但非前台Activity——比如在当前Activity弹出了对话框。
  • 后台Activity——调用了onStop的Activity。

Activity异常销毁

当系统内存不足时,会按照Activity优先级从低到高杀死Activity所在进程,当旋转屏幕方向、键盘等系统原因发生变化时,会重建Activity,可在onSaveInstanceStateonRestoreInstanceState中通过Bundle进行数据的保存与恢复(瞬时UI状态,切勿存储持久性数据),在onCreate中进行数据恢复时应对Bundle进行空值判断,如果一个进程脱离了四大组件,那么它将很快被销毁,可通过服务提高其优先级。

Activity四种启动模式

启动模式必要性:避免重复创建Activity实例。

  • 标准模式(standard):系统默认的启动模式,每次启动Activity都会创建一个新的实例位于相同任务栈中,每一个实例可存在与不同的任务栈中,同时一个任务栈也可存在多个实例,当前模式下不能通过非Activity类型的Context(ApplicationContext)来启动Activity。
  • 栈顶复用(singleTop):当启动的Activity正好位于栈顶时,会回调onNewIntent方法,不会创建新的实例,同时不会执行onCreate与onResume,否则会重新创建新的实例。
  • 栈内复用(singleTask):当启动的Activity存在当前栈内,则会回调onNewIntent方法,不会创建新的实例,并且将其上的Activity全部出栈,若当前栈内不存在并且指定为当前任务栈,则会创建实例压入栈顶,若启动Activity为新的任务栈则会创 建任务栈与该实例。taskAffinity用于指定任务栈名称,通常与allowTaskReparenting或者singleTask模式一起使用,
  • 单例模式(singleInstance):该启动模式下,会为其创建新的任务栈与实例。

通过集合管理Activity

public class ActivityController {
    private static ArrayList<Activity> activities = new ArrayList<>();
    public static void addActivity(Activity activity){
        activities.add(activity);
    }

    public static void removeActivity(Activity activity){
        activities.remove(activity);
    }

    public static void finishAll(){
        for (Activity act:activities){
            if (act.isFinishing()){
                act.finish();
            }
        }
    }
}

IntentFilter匹配规则

一个Intent只有同时匹配action类别、category类别、data类别才能算完全匹配,才能启动Activity,一个Activity可以有多个IntentFilter,Intent只需要匹配一个即可。

  • data匹配规则:区分大小写,只需与过滤规则中的任意一个data完全相同即匹配成功。
  • category匹配规则:Intent中如果含有category,那么所有的category必须与过滤规则中的category完全匹配。
  • action匹配规则:
    • mimeType:指媒体类型文件。
    • Scheme:URI的模式,比如:file、content、http。
    • Host:主机名,比如www.baidu.com。
    • Port:端口号,比如80。
    • Path、pathPattern:完整路径 。
    • pathPrefix:路径前缀信息。

Intent注意事项

  • 若要同时设置 URI 和 MIME 类型,请勿调用 setData() 和 setType(),因为它们会互相抵消彼此的值。请始终使用 setDataAndType() 同时设置 URI 和 MIME 类型。
  • 为了确保应用的安全性,启动 Service 时,请始终使用显式 Intent,且不要为服务声明 Intent 过滤器,使用隐式 Intent 启动服务存在安全隐患,因为您无法确定哪些服务将响应 Intent,且用户无法看到哪些服务已启动,从 Android 5.0(API 级别 21)开始,如果使用隐式 Intent 调用 bindService(),系统会引发异常。
  • 用户可能没有任何应用处理您发送到 startActivity() 的隐式 Intent,要验证 Activity 是否会接收 Intent,通过Intent 对象调用 resolveActivity(), 如果结果为空,则不应使用该 Intent,
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(sendIntent);
}

也可通过PackageManager调用quryIntentActivities()。

List<ResolveInfo> resolveInfo =  context.getPackageManager().queryIntentActivities(intent,  PackageManager.MATCH_DEFAULT_ONLY);  
if (resolveInfo.size() > 0) {  
        return true;  
    }  
    return false;  
} 

猜你喜欢

转载自blog.csdn.net/qq_33706840/article/details/81409274