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 执行 1.1 -> A onStop

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

B 执行1.2 ->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);
    }
}

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

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

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

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

时间: 2024-09-28 20:06:56

android的一些基础知识的相关文章

Android学习之基础知识十四 — Android特色开发之基于位置的服务

一.基于位置的服务简介 LBS:基于位置的服务.随着移动互联网的兴起,这个技术在最近的几年里十分火爆.其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动设备所在的位置,而这种技术早在很多年前就已经出现了. 那么为什么LBS技术直到最近几年才开始流行呢?这主要是因为,在过去移动设备的功能及其有限,即使定位到了设备所在的位置,也就仅仅只是定位到了而已,我们并不能在位置的基础上进行一些其他的操作.而现在就大大不同了,有了Android系统作为载体,我们可

Android手机分辨率基础知识(DPI,DIP计算)

1.术语和概念 术语 说明 备注 Screen size(屏幕尺寸) 指的是手机实际的物理尺寸,比方经常使用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 摩托罗拉milestone手机是3.7英寸 Aspect Ratio(宽高比率) 指的是实际的物理尺寸宽高比率,分为long和nolong Milestone是16:9,属于long Resolution(分辨率) 和电脑的分辨率概念一样,指手机屏幕纵.横方向像素个数 Milestone是854*480 DPI(dot per inch)

【转】Android手机分辨率基础知识(DPI,DIP计算)

1.术语和概念 术语 说明 备注 Screen size(屏幕尺寸) 指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 摩托罗拉milestone手机是3.7英寸 Aspect Ratio(宽高比率) 指的是实际的物理尺寸宽高比率,分为long和nolong Milestone是16:9,属于long Resolution(分辨率) 和电脑的分辨率概念一样,指手机屏幕纵.横方向像素个数 Milestone是854*480 DPI(dot per inch) 每英

Android学习之基础知识二(build.gradle文件详解)

一.详解build.gradle文件 1.Android Studio是采用Gradle来创建项目的,Gradle是非常先进的构建的项目的工具,基于Groovy领域特定的语言(DSL)来声明项目配置,摒弃了传统基于XML(如Ant.Maven)的各种烦琐的配置. 2.Android项目中存在两个build.gradle文件,一个在外层,一个在app中: A.外层的build.gradle文件:当需要添加全局的项目构建配置时才修改其中的内容 jcenter():代码托管仓库,存放Android开源

Android学习之基础知识七—碎片的使用

碎片(Fragment)是一种可以嵌入在活动中的UI片断,它能让程序更加合理和充分地利用大屏幕的空间,它与活动相似,可以简单的理解为一个迷你型的活动,它也有自己的生命周期.碎片在平板的应用非常广泛. 一.碎片的简单用法 需求:在一个活动中添加两个碎片,并让这两个碎片平分活动空间. 第一步:由于碎片通常应用在平板开发中,所以先创建一个平板模拟器,然后新建一个Android项目:FragmentTest 第二步:创建左侧.右侧两个碎片布局     第三步:新建一个LeftFragment类继承Fra

Android学习之基础知识八—Android广播机制

一.广播机制简介 Android提供了一套完整的API,允许应用程序自由的发送和接受广播,发送广播借助于我们之前学过的:Intent,而接收广播需要借助于广播接收器(Broadcast Receiver) 广播的类型主要分为两种:标准广播和有序广播. 标准广播:一种完全异步执行的广播,在广播发出之后,所有接收器几乎在同一时刻接收到这条广播消息,因此它们之间没有任何的先后顺序可言,这种广播的效率会比较高,但是同时也意味着它无法被截断的.标准广播的工作流程图如图所示: 有序广播:一种同步执行的广播,

Android学习之基础知识九 — 数据存储(持久化技术)之使用LitePal操作数据库

上一节学习了使用SQLiteDatabase来操作SQLite数据库的方法,接下来我们开始接触第一个开源库:LitePal.LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发最常用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种建表和增删改查的操作,LitePal的项目主页上也有详细的使用文档,地址是: https://github.com/LitePalFramework/LitePal 一.配置LitePal 要在

Android学习之基础知识十三—网络编程的最佳实践

上一讲已经掌握了HttpURLConnection和OkHttp的用法,知道如何发起HTTP请求,以及解析服务器返回的数据,但是也许你还没发现,之前我们的写法其实是很有问题的,因为一个应用程序很可能会在许多地方使用到网络功能,而发送HTTP请求的代码基本都是相同的,如果我们每次都去编写一遍发送HTTP请求的代码,这显然是非常差劲的做法. 通常情况下我们都应该将这些通用的网络操作提取到一个公共的类里,并提供一个静态方法,当想要发起网络请求的时候,只需要简单的调用一下这个方法即可,比如使用如下的写法

Android学习之基础知识十六 — Android开发高级技巧的掌握

一.全局获取Context的技巧 前面我们很多地方都使用到了Context,弹出Toast的时候.启动活动的时候.发送广播的时候.操作数据库的时候.使用通知的时候等等.或许目前来说我们并没有为得不到Context而发愁,因为我们很多地方都是在活动中进行的,而活动本身就是一个Context对象,但是,当应用程序的架构逐渐开始复杂起来的时候,很多的逻辑代码都将脱离Activity类,但此时又恰恰需要使用Context,特许这个时候就会感到有些伤脑筋了. 举个例子,在前面网络编程的最佳实践中,我们编写