美文网首页Android知识
Android基础简单回顾

Android基础简单回顾

作者: stefanJi | 来源:发表于2016-12-06 17:10 被阅读0次

    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);

    相关文章

      网友评论

        本文标题:Android基础简单回顾

        本文链接:https://www.haomeiwen.com/subject/bvurmttx.html