Android第一行代码笔记 Activity的一些基础知识

一:Activity的生命周期图




二  当系统内存不足 activity被回收时,数据如何保存

public class SaveTempDateActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_save_temp_date);
        //        获取之前界面的临时值
        if (null != savedInstanceState) {
            String tempDate = savedInstanceState.getString("tempDate");
        }
    }
    /**
     * 通过Bundle  在内存不足activity被回收时 用于存储界面输入的一些数据
     * 可以在onCreate方法的Bundle onSavedInstanceState参数中取到值
     * 只有activity在异常终止时,才会调用onSavedInstanceState和onRestoreInstanceState。在按home键或重新启动activity也会出发onSaveInstanceState
     * @param outState
     * @param outPersistentState
     */
    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        String tempDate = "一些界面临时值";
        outState.putString("tempDate", tempDate);
    }
	/**
 	* 这个方法一旦被调用,savedInstanceState一定有值。
 	* 如果做值恢复,官方更建议这个
 	* @param savedInstanceState
 	*/
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
    	super.onRestoreInstanceState(savedInstanceState);
	
	}
}

三 随时退出程序

public class ActivityCollector {
    public static List<Activity> activityList = new ArrayList<>();

    public static void addActivity(Activity activity) {
        activityList.add(activity);
    }

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

    public static void finishAll() {
        for (Activity a :
                activityList) {
            if (!a.isFinishing()){
                a.finish();
            }
        }
    }

}

方便管理所有activty建立一个BaseActivty

public class BaseActivty extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
//      所有activity都继承者BaseActivity 获取当前的活动并打印
        String activityName = getClass().getSimpleName();
        Log.i("activityName:",activityName);
//        一经创建activity就添加进activity管理类里面
        ActivityCollector.addActivity(this);

    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
//        一经销毁activity就移除进activity管理类里面
        ActivityCollector.removeActivity(this);
    }
}

四 启动活动的最佳写法

应用场景:假若启动SecondActivity 必须要穿入两个参数

则也可以在SecondActivity中创建一个

public static void actionStart(Context context,String data1,String data2){
    Intent intent = new Intent(context,IntentTwoActivity.class);
    intent.putExtra("param1",data1);
    intent.putExtra("param2",data2);
    context.startActivity(intent);

}
怎样做的好处是,可以很快清楚启动SecondActivity需要的一些条件。


补充:来自android群英传

activity的形态

1.active/running 处于activity栈顶,可见,并能进行交互。

2.paused  activity失去焦点,被弹出框遮挡,或者被一个透明的activity遮盖,这时activity可见,但不能进行交互,所有的状态成员都保持着,只有在系统内存极低的情况下,才会被系统回收掉。

3.stopped activity不可见,但是依然保持了多有状态信息和成员变量,在后台运行。

4.kill  activity被系统回收,或者从来没有被创建。


onCreate():创建基本的ui元素

onResume(): 如果是暂停与恢复,需要重新初始化在onPause中释放的资源。

onPause()与onStop():释放系统资源,如Camera,sensor,receivers  。清除activity的资源,避免浪费

onDestroy():引用会在activity销毁的时候销毁,而线程不会,所以清除开启的线程。

如果系统长时间处于stopped形态,且此时系统需要更多内存,或者系统内存极为紧张时,系统就会回首你的activity,此时系统为了补偿你,会将activity状态通过onSaveInstanceState()方法保存到Bundle对象中。可以在onCreat()方法中取出bundle值。但如果是通过调用finish()方法结束了activity,那么onSaveInstanceState是不会被调用的。而且android系用默认实现了控件的状态缓存,以此来减少开发者需要实现的缓存逻辑。


android启动模式 在清单文件中设置

standard:每次都会重新创建。

singleTop: 如果任务栈顶有这个activity,则不会重新创建。否则重新创建。这种模式适用于接收消息显示界面。(比如接收qq消息,来10条消息不能弹出10个activity)这种模式不会创建新的实例,但是系统会在activity启动的时候调用onNewIntent()方法。

singleTask: 如果任务栈里有这个activity,不重建,并且将该activity以上的activity都销毁。不过这里指的是同一个app中启动这个activity。如果其他程序一singleTask模式来启动这个activity。那么他将创建一个新的任务栈。不过如果启动模式为singleTask的activity已经在后台的一个任务栈里,那么启动后,后台的这个任务栈将一起被切换到前台。如下图:


可以发现,使用这个模式创建的activity不是在新的任务栈中打开的,就是将已打开的activity切换到前台,这种模式通常可以用于退出整个引用:将主activity设置为singleTask模式,然后再要退出的activity中中转到主activity,从而将主activity之上的activity都清除,然后重写主activity的onNewIntent方法,在改方法中执行finish()方法。将最后一个activity关闭。

singleInstance:创建一个新任务栈,且该栈中只存在这一个activity。这种模式常用于需要与程序分离的界面。如调用紧急呼叫。

⚠️注意:如果在一个singTop活着singleInstance的activitya中通过startActivityForResult()方法来启动另一个activityb,那么系统将直接返回Activity.RESULT_CANCELED而不会再去等待返回。因为系统framework层对这两种模式做了限制,因为android开发者认为,不同Task之间,默认是不能传递数据的,如果一定要传递,那就只能通过intent来绑定数据。


通过设置intent的Flag来设置activity的启动模式

Intent.FLAG_ACTIVITY_NEW_TASK:使用一个新的task来启动一个activity,但启动的每个activity都将在一个新的task中。用于从Service中启动activity的场景,由于在Service中并不存在activity栈,所以使用该Flag来创建一个新的activity栈,并创建新的activity实例。

Intent.FLAG_ACTIVITY_SINGLE_TOP:与singleTop一样

Intent.FLAG_ACTIVITY_CLEAR_TOP:与singleTask一样

Intent.FLAG_ACTIVITY_NO_HISTORY:使用这种模式启动的activity,当该activity启动其他activity后,改activity就消失了。不会再保留在activity栈中,例如a-b,b以这种模式启动c ,c再启动d,这时候任务栈里:abd。


清空任务栈

可以在清单文件中的<activity>标签中使用以下几种属性来清理任务栈

clearTaskOnLaunch:每次返回该activity时,都将该activity之上的所有activity清除,通过这个属性,可以让这个task每次在初始化的时候,都只有这一个activity

finishOnTaskLaunch:通过这个属性,当离开这个activity说处的task,用户再返回时,该activity就会被finish掉

alwaysRetainTaskState:将这个属性设置为true,那么该activity所在的task将不接受任何清理命令,一直保持当前task状态。



补充:来自android开发艺术探索

activity优先级:

前台优先级最高,其次是可见但非前台,最后是不可见的后台运行activity。但系统内存不足时,就会按照优先级从低到高去杀死目标activity所在的进程。如果一个进程中没有四大组件在执行,那么这个进程很快会被系统杀死。因此,一些后台工作不适合脱离四大组件而独立运行在后台中。比较好的方法是将后台工作放在service中,从而保证进程有一定的优先级,这样就不会被轻易杀死。

ApplicationContext不能启动一个activity:因为非Activity类型的Context并没有所谓的任务栈,但启动一个activity就会进行入栈(默认情况下,所有activity所需的任务栈名字为应用的包名,另外我们也可以通过制定TaskAffinity属性来指定。这个属性主要和singleTask启动模式,或者allowTaskReparenting属性配对使用,其他情况下没有意义。另外任务栈又分为前台任务栈和后台任务栈,后台任务栈中的activity位于暂停状态,用户可以通过切换后台任务栈再次调到前台。)的操作。解决问题的方法是为待启动的activity自定FLAG_ACTIVITY_NEW_TASK标记位。这样启动就会为它创建一个新的任务栈。

设置启动模式的时候(参照补充群英传),通过代码设置的优先级高于在清单文件中的设置,当两种都设置了的时候,以代码指定为准。


IntentFilter过滤匹配规则

intentFilter中过滤的信息有 action,category,data。

1.action的匹配规则:action的匹配要求Intent中的action存在且必须和过滤规则中的其中一个action相同。另外它严格区分大小写。(可以添加很多个action,只要有一个和清单文件中设置的action吻合,就可以了)

 2.category的匹配规则:Intent中如果含有category,那么所有的category都必须和过滤规则中的其中一个category相同。如果没有指定category只要intent匹配也可以。因为系统在调用startActivity()的时候会默认给Intent加上“android.intent.category.intent.category.DEFAULT”这个category。(可以添加多个category,但是每一个添加的category都必须和清单文件中的category相匹配)

3.data的匹配规则:和action类似。















评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值