Android基础简单回顾

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

内部存储的访问可以通过:

  1. getFileDir():用来存储app内部数据,当内部存储紧张时不会被自动删除
  2. getCacheDir():用户存储App内部的缓存数据,当内部存储紧张时回被系统自动的删除
  3. openFileOutput():对getFileDir的封装。返回outputstream流

外部储存:storage文件夹,也有可能是mnt文件夹

  1. 在manifest添加android.permission.WRITE_EXTERNAL_STORAGE权限
  2. 外部存储的访问前首先要判读是否可用:getExternalStorageState()==Enviroment.MEDIA_MOUNTED时表示已经挂载成功可以使用
  3. 若需要在app被卸载时数据随同删除可以通过getexternFileDir。
  4. 若需要保留则使用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-filter…/>配置,只要某个Activity(或BroadcaseReceiver)的<intent-filter…/>配置中包含了Intent携带的Action字符串,该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声明

<activity android:name=".TestActivity">
        <intent-filter>
            <!--需要Intent的Action为"xxx",Category为"xxx_category"-->
            <action android:name="xxx" />
            <category android:name="xxx_category" />
            <!--需要Intent的Data属性scheme为"xxx",
            且host为"xxx",
            post为111,
            path为"myPath",
            type为"abc/xyz",才能启动该Activity
            -->
            <data
                android:host="xxx"
                android:mimeType="abc/xyz"
                android:path="/myPath"
                android:port="111"
                android:scheme="xxx">

            </data>
        </intent-filter>
    </activity>

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);
赏杯咖啡 🍵 Donate