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方法。

     

  • 相关阅读:
    封装成帧、帧定界、帧同步、透明传输(字符计数法、字符串的首尾填充法、零比特填充的首尾标志法、违规编码法)
    计算机网络之数据链路层的基本概念和功能概述
    物理层设备(中继器、集线器)
    计算机网络之传输介质(双绞线、同轴电缆、光纤、无线电缆、微波、激光、红外线)
    计算机网络之编码与调制
    0953. Verifying an Alien Dictionary (E)
    1704. Determine if String Halves Are Alike (E)
    1551. Minimum Operations to Make Array Equal (M)
    0775. Global and Local Inversions (M)
    0622. Design Circular Queue (M)
  • 原文地址:https://www.cnblogs.com/kimmy/p/4662058.html
Copyright © 2011-2022 走看看