Activity
1. 启动Activity:
系统会先调用onCreate->onStart->onResume方法,Activity进入运行状态
2. 当前Activity被其他Activity覆盖或被锁屏:
系统会调用onPause方法,暂停Activity的执行
3. 当前Activity由被覆盖回到前台或解锁屏:
系统会调用onResume方法,再次进入运行状态
4. 当前Activity转到新的Activity界面或按Home键返回到主屏,自身退居后台:
系统会先调用onPause方法,然后进入onStop方法,进入停滞状态
5. 用户退回到此Activity:
系统会调用onRestart->onStart->onResume方法,再次进入运行状态
6. 当前Activity处于被覆盖状态或后台不可见状态(即第2步和第4步),系统内存不足,杀死当前Activity,而后用户退回当前Activity:
再次调用onCreate->onStart->onResume方法,进入运行状态
7. 用户退出当前Activity:
系统先调用onPause->onStop->onDestory方法,结束当前Activity
onResume执行时Activity显示
数据存储
1
|存储方式|数据特点|数据量|文件类型|储存位置||
-------------------------------------------------------------|
|SharedPreferences|boolean,int,float,long和String五种简单的数据类型|无限制|基于XML文件存储的“key-value”键值对数据|在data/data/程序包名/shared_prefs目录下|
|文件存储 | |无限制|任意文件|在设备本身的存储设备或者外接的存储设备中,自己指定目录|
|Sqlite数据库 |适用复杂的关系型数据|无限制|数据库文件|在/data/data/程序包名/databases目录下|
|ContentProvider |允许其他应用访问或修改|无限制|常见: 音频,视频,图片和通讯录|本质也是数据库|
2
内部储存:data文件夹就是内部存储
- data/data/包名/shared_prefs
- data/data/包名/databases
- data/data/包名/files
- data/data/包名/cache
内部存储的访问可以通过:
- getFileDir():用来存储app内部数据,当内部存储紧张时不会被自动删除
- getCacheDir():用户存储App内部的缓存数据,当内部存储紧张时回被系统自动的删除
- openFileOutput():对getFileDir的封装。返回outputstream流
外部储存:storage文件夹,也有可能是mnt文件夹
- 在manifest添加android.permission.WRITE_EXTERNAL_STORAGE权限
- 外部存储的访问前首先要判读是否可用:getExternalStorageState()==Enviroment.MEDIA_MOUNTED时表示已经挂载成功可以使用
- 若需要在app被卸载时数据随同删除可以通过getexternFileDir。
- 若需要保留则使用getExternalStoragePublicDirectory()
Intent
Intent代表了Android应用的启动"意图",Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,则取决于Intent的各属性.
1. Intent的Component属性
1. 通过Intent的Component属性设置启动组件,需要接受一个ComponentName对象.Component对象包含一些构造器
1. ComponentName(String pkg,String cls):创建pkg所在包下的cls类所对应的组件
2. ComponentName(Context pkg,String cls):创建pkg所对应的包下的cls类所对应的组件
3. ComponentName(Context pkg,Class> cls):创建pkg所对应的包下的cls类所对应的组件
2. 通过其他方法设置Component
1. setClass(Context packageContext,Class> cls):设置该Intent将要启动的组件对应的类
2. setClassName(Context packageName,String className):设置该Intent将要启动的组件对应的类名
3. setClassName(String packageName,String className):设置该Intent将要启动的组件对应的类名
在Android里Context对象和该应用的包名有一一对应的关系,因此上面三个setClass方法,都是指定组件的包名,然后指定启动的组件
-
指定了Component属性的Intent称为显式Intent
//启动显式Intent ComponentName componentName = new ComponentName(MainActivity.this, TestActivity.class); Intent intent = new Intent(); intent.setComponent(componentName); startActivity(intent); //通常情况下,使用这种简化的写法 (Intent提供的这个简化的构造器) Intent intent = new Intent(MainActivity.this, TestActivity.class); startActivity(intent);
2 Intent的Action,Category属性
Action、Category属性的值都是普通的字符串
Action代表该Intent所要完成的一个抽象动作,而Category则用于为Action增加额外的附加类信息
Action要完成的只是一个抽象的动作,这个动作具体由哪个组件Activity(或BroadcaseReceiver)来完成,Action这个字符串本身不管用
启动哪个Activity或BroadcaseReceiver,取决于Activity(或BroadcaseReceiver)的
Intent通过指定Action属性,就可以把该Intent与具体的Activity分离。
每个Intent只能指定一个Action,但是一个Intent又想有多余的要求,就需要用到Category属性
Intent在配置时可以携带一个Action和多个Category,同时每个组件(Activity,Service,BroadcastReceiver)可以声明自己满足多个Action要求,多个Category要求。
只要某个组件能满足的要求大于、等于Intent携带的要求,那么该Intent就能启动该组件
2. Data、Type属性与intent-filter配置
- Data属性通常向Action属性提供操作的数据,Data属性接受一个Uri对象
- Type属性用于指定该Data属性所制定的Uri对应的MIME类型(设定某种扩展名的文件用一种应用程序来打开的方式类型),这种MIME类型可以是任意的abc/xyz格式的字符串
如果为Intent先设置Data属性,后设置Type属性,Type属性将会覆盖Data属性
如果为Intent先设置Type属性,后设置Data属性,Data属性将会覆盖Type属性
如果想Intent既有Data又有Type,可以调用Intent的setDataAndType()方法
AndroidManifest声明
3. Intent的Extra属性
Intent的Extra属性用于多个Activity之间传递数据
- 可以通过Intent的putExtra方法传递基本数据类型和可序列化的对象
- 可以通过Intent的putExtras方法传递将数据打包的Bundle对象
public Intent putExtra(String name, String,Int,boolen,Char等 value);
//
Intent intent = new Intent(MainActivity.this, TestActivity.class);
String name = "jack";
int age = 20;
intent.putExtra("name", name);
intent.putExtra("age", age);
startActivity(intent);
public Intent putExtras(Bundle extras);
//
String name = "jack";
int age = 20;
Bundle bundle = new Bundle();
bundle.putString("name", name);
bundle.putInt("age", age);
Intent intent = new Intent(MainActivity.this, TestActivity.class);
intent.putExtras(bundle);
startActivity(intent);