zoukankan      html  css  js  c++  java
  • android整理的一些基础知识

    本篇文章内容大部分是来源于本人实际开发中的心得总结,不是非常全面,咱才疏学浅,如果有错误的地方恳请各位指出哦~

    android四大组件

    四大组件包括:Activity(活动),Service(服务),BroadcastReceiver(广播接收器),ContentProvider(内容提供器)

    他们的一个特性是都是需要在androidManifest.xml里面注册

    1:Activity篇

    活动是一个包含各种元素的界面,主要用于和用户进行交互。

    1.1:如何启动Activity

     1.1.1:显示启动,明确指明活动的类名

    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
    startActivity(intent);

    1.1.2:隐式启动,匹配活动的名称与类型

    在AndroidManifest.xml指定名称(action)和类型(category)

    <activity android:name=".SecondActivity" >
        <intent-filter>
            <action android:name="com.example.activitytest.ACTION_START" />
            <category android:name="com.example.activitytest.MY_CATEGORY" />
        </intent-filter>
    </activity>

        代码:

    Intent intent = new Intent("com.example.activitytest.ACTION_START");
    intent.addCategory("com.example.activitytest.MY_CATEGORY");
    startActivity(intent);

    1.2:Activity启动模式

    通过stack栈管理,参考

    1.3:Activity如何传值

    与fragment结合的传值例子,参考

    2:Activity生命周期

    2.1:创建

     onCreate -> onStart -> onResume

    2.2 :销毁

     onPause -> onStop -> onDestroy

    2.3:生命周期

    在当前activity A上,启动 activity B,此时执行顺序是

    A onPause -> B 执行 onCreate -> A onStop

    B调用finish()结束自己,此时执行顺序是

    B 执行onStop ->A onRestart ->A onStart -> A onResume

    3:服务(Service)

    服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行那
    些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使
    当程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。
    不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务
    时所在的应用程序进程。当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停
    止运行。

    3.1:创建一个服务

    继承于Service父类,记得在androidManifest.xml里的application节点注册该服务,例子

     <service android:name=".media.BGMusicService" ></service>

    3.2:如何启动、关闭服务

    活动.startService(new Intent(Context, 服务.class));
    活动.stopService(new Intent(Context, 服务.class));

    4:BroadcastReceiver(广播接收器)

    广播接收器可以接收系统发出的广播(比如开机、网络变化等),也可以接收本地发出的自定义广播,对其作出处理。

    4.1:创建一个广播接收器

    继承于BroadcastReceiver父类,实现onReceive方法。

    4.2:启动一个广播接收器

    广播可以在androidMenifest.xml里面注册,实现静态启动(不依赖宿主生命周期)也可以由Context启动,关键取决于这个广播接收器的用途

    比如咱们做一个来电归属地悬浮窗,那就需要静态启动,不依赖于app的生命周期。

    再比如接网络变化广播,咱们app有个选项,需要频繁访问当前网络状态是否wifi,依次来决定是否下载图片。因此就需要这个广播,当网络变化时,将新网络状态赋值到某个全局变量。

    需要注意的是,大部分广播接收器都需要程序允许访问某些权限的,不要忘了哟~,比如开机需要RECEIVE_BOOT_COMPLETED,网络变化需要ACCESS_NETWORK_STATE

    4.2.1:静态启动,比如监听来电

     <receiver android:name=".call.IncomingCallBroadCastReceiver">
                <intent-filter android:priority="1000">
                    <action android:name="android.intent.action.PHONE_STATE" />
                </intent-filter>
            </receiver>

    4.2.2:手动启动

      IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
      context.registerReceiver(网络状态广播接收类, intentFilter);

    需要手动注销哦

      context.unregisterReceiver(receiver);

    5:ContentProvider内容提供器

    android系统提供了自带的内容提供器,最常用的比如通讯录,因此在程序中,我们才可以对通讯录进行增删改查

    我们也可以创建自带的内容提供器。

    贴出来一个通讯录的查询与新增代码

    package zhexian.app.smartcall.lib;
    
    import android.app.Activity;
    import android.content.ContentResolver;
    import android.content.ContentUris;
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.net.Uri;
    import android.provider.ContactsContract;
    
    import zhexian.app.smartcall.contact.ContactEntity;
    import zhexian.app.smartcall.image.ZImage;
    import zhexian.app.smartcall.tools.Utils;
    
    import static android.provider.ContactsContract.Data.CONTENT_URI;
    import static android.provider.ContactsContract.Data.MIMETYPE;
    import static android.provider.ContactsContract.Data.RAW_CONTACT_ID;
    
    
    public class ZContact {
    
        public static boolean isPhoneExists(Context context, String phone) {
            Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + phone);
            ContentResolver resolver = context.getContentResolver();
            Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Data.DISPLAY_NAME}, null, null, null);
    
            boolean isExist = cursor.moveToFirst();
            cursor.close();
            return isExist;
        }
    
        public static void Add(Activity activity, ContactEntity entity) {
            ContentValues values = new ContentValues();
    
            ContentResolver content = activity.getContentResolver();
            Uri rawContactUri = content.insert(
                    ContactsContract.RawContacts.CONTENT_URI, values);
            long rawContactId = ContentUris.parseId(rawContactUri);
    
            //name
            values.clear();
            values.put(RAW_CONTACT_ID, rawContactId);
            values.put(MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
            values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, entity.getUserName());
            content.insert(CONTENT_URI, values);
    
            // dept
            values.clear();
            values.put(android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactId);
            values.put(MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE);
            values.put(ContactsContract.CommonDataKinds.Organization.COMPANY, entity.getCompany());
            values.put(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, entity.getDepartment());
            values.put(ContactsContract.CommonDataKinds.Organization.TITLE, entity.getJobTitle());
            values.put(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK);
            content.insert(CONTENT_URI, values);
    
            //phone
            values.clear();
            values.put(android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactId);
            values.put(MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
            values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, entity.getPhone());
            values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE);
            content.insert(CONTENT_URI, values);
    
    
            //short phone
            values.clear();
            values.put(android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactId);
            values.put(MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
            values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, entity.getShortPhone());
            values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK);
            content.insert(CONTENT_URI, values);
    
            // avatar
            values.clear();
            values.put(
                    android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID,
                    rawContactId);
            values.put(MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
            values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, Utils.ConvertBitMapToByte(entity.getAvatarURL(), ZImage.getInstance().getBitMap(entity.getAvatarURL())));
            content.insert(CONTENT_URI, values);
        }
    }
    View Code

    6:Message,Handler,Message Queue,Looper之间的关系。

    在线程和ui元素交互时,我们使用Handler来避免线程安全问题。

    Message作为Handler的方法sendMessage()参数,在调用Handler的时候一并传递过去。

    Message放在Message Queue里面,等待Looper循环取出,作为参数回调其Handler的handleMessage方法。

     

  • 相关阅读:
    Python校验文件MD5值
    no acceptable C compiler found in $PATH解决办法
    PRD是什么
    项目中PO、PM的职责区分
    vue-cli中打包之后css加载顺序有错
    vue-cli中打包图片路径错误
    vue2.0的父子组件数据传递
    vue中style的用法
    vue中class的用法
    angular淘宝购物车案例
  • 原文地址:https://www.cnblogs.com/kimmy/p/4662058.html
Copyright © 2011-2022 走看看