四大组件之一活动

活动状态

运行状态:活动处于栈顶

暂停状态:活动不处于栈顶,但仍然可见

停止状态:完全不可见

销毁状态:离开返回栈

生存期

onCreate()

onStart():不可见到可见调用

onResume():与用户进行交互,处于栈顶运行态

onPause():准备启动或者恢复另一活动,

onStop():完全不可见的时候调用

onDestory():被销毁之前调用,之后变为销毁状态

onRestart():这个方法由停止状态变为运行状态之前调用,也就是活动重新启动了

当Activity A到Activity B跳转时如果此时内存不够,回收了A,当我们按返回键时仍然会回到A,并且此时执行的不是A的onRestart()。而是onCreate().为了保存数据,我们可以回掉onSaveInstanceState()方法将数据放入bundle对象中,在onCreate()方法中有bundle参数进行获取

活动的启动模式

在配置文件Activity中配置launchMode属性

standard 默认

每次启动一个新活动,它就会在返回栈中入栈,并处于栈顶位置。如果我们在一个Activity中跳转自己。点击两次创建之后,我们需连按三次Back建才能退出程序。

singleTop

解决了默认情况下,在栈顶还要创建不合理。也就是如果Activity处于栈顶不创建,不处于栈顶就会重新创建。

singleTask

解决一个栈中有多个Activity实例,也就是如果发现已经存在栈中就把这活动之上的统统出栈,没有则创建

singleInstance

指定为该模式的活动会启动一个新的返回栈来管理这个活动。

四大组件之二广播

标准广播:异步执行的广播

有序广播:同步执行的广播(对于广播接收器是有先后顺序)

接收系统广播

动态注册监听网络变化

在代码中注册为动态注册

在AndroidManifest.xml文件中注册时静态注册

首先需要创建广播接收器

我们只需要新建一个类让它继承BroadcastReceiver,并重写父类的onReceive()(有广播来时,这个方法会得到执行)方法就行了。具体逻辑这个方法中处理,注意不能写耗时操作要不然anr异常,如果需要我们可以启动一个服务Service,不要使用新线程完成。因为广播接收器的生命周期很短。可能出现子线程还没有结束,广播解释器已经退出了。

发送广播:

创建一个IntentFilter 实例。并给他添加一个action如:android.net.com.CONNECTIVITY_CHANGE(网络发生变化的广播),

创建一个NetworkChangeReceiver(自定义的广播接收器类)的实例。

调用registerReceiver()方法进行注册。将两个实例传进去。

最后记得动态注册广播接收器一定要取消注册才行。在onDestory()方法中调用unregisterReceiver()方法来实现。

静态注册(实例:实现开机启动)

动态注册广播很灵活但是存在缺点:必须要程序在启动之后才能接受到广播。因为注册逻辑是写在onCreate()方法中。所以有静态注册

首先我们自定义一个广播接收器:定义一个类BootCompleteReceiver继承BroadcastReceiver。重写onReceiver()方法。里面写个Toast()打印String。

在AndroidManifest.xml中将这个广播接收器类名进行注册。

新建一个标签,通过android:name来指定注册哪一个广播接收器,然后在标签加入想要接收的广播就行了。

Android系统启动完成后发出一条值为:android.intent.action.BOOT_COMPLETED的广播。因此将这个添加到的

这里还需要一个权限:android.permission.RECEIVE_BOOT_COMPLETED权限。

发生自定义广播

发送标准广播

发送广播之前先定义一个广播接收器,并且进行注册。action(“com.zts.broadcast.MY_BROADCOAST”);

我们定义一个Button作为发送广播的触发点。

在监听事件中调用

Intent intent=new Intent(“com.zts.broadcast.MY_BROADCOAST”);

sendBroadcast(intent);

由于广播是使用intent进行传递的,因此我们可以在intent中携带数据传递给广播接收器

发送有序广播

发送有序广播我们只需要改动一行代码,即将sendBroadcast()方法改成sendOrderedBroadcast(intent,null)

这个时候广播接收器就有先后顺序了,而且前面的广播接收器还可以将广播截断,阻止其继续传播。

设置广播接收器的先后顺序

在intent—filter标签中设置属性android:priority=100意思是优先级设成了100

获得了广播的优先权,我们可以阻止继续传播,在onReceive方法中调用:abortBroadcast();

android.intent.action.TIME_SET:系统时间被修改。

android.intent.action.DATE_CHANGED:系统日期被修改。

android.intent.action.BOOT_COMPLETED:系统启动完成。

android.intent.action.BATTERY_CHANGED:设备电量改变。

android.intent.action.BATTERY_LOW:设备电量低。

android.intent.action.ACTION_POWER_CONNECTED:设备连接电源。

android.intent.action.ACTION_POWER_DISCONNECTED:设备断开电源。

android.provider.Telephony.SMS_RECEIVED:系统收到短信。

android.intent.action.NEW_OUTGOING_CALL:拨打电话。

android.intent.action.SCREEN_OFF当屏幕锁屏的时候触发

android.intent.action.SCREEN_ON屏幕解锁的时候触发

android.intent.action.USER_PRESENT当用户重新唤醒手持设备时触发

ACTION_TIME_CHANGED:系统时间被改变

ACTION_TIMEZONE_CHANGED:系统时区被改变

ACTION_BOOT_COMPLETED:系统启动完成

ACTION_PACKAGE_ADDED:系统添加包

ACTION_PACKAGE_CHANGED:系统的包改变

ACTION_PACKAGE_REMOVED:此外的包被删除

ACTION_PACKAGE_RESTARTED:系统的包被重启

ACTION_PACKAGE_DATA_CLEARED:系统的包数据被清空

ACTION_SHUTDOWN:系统被关闭

使用本地广播

为了简单解决广播安全性问题(自己广播被拦截,或垃圾广播)。LocalBroadcaseManager()

我只需要先获得这个管理类

LocalBroadcastManager localBroadcastManager=LocalBroadcastManager.getInstance(this);

发生广播时用这个对象发送即可localBroadcastManager.sendBroadcast(intent);

注册和取消注册同样也是用这个对象去调用相应的方法

本地广播是无法通过静态注册方式去接收的。他的优势:

广播在我们程序内部,不必担心机密数据泄露

其他的程序无法将广播发送到我们内部

发生本地广播比起发送系统全局广播将会更加高效

四大组件之三服务

服务的基本用法

定义一个服务

新建一个MyService的类,并让他继承Service此时要重写onBind()方法,我们可以重写如下方法:

onCreate():在服务创建的时候调用

onStartCommand()方法会在每次服务启动的时候调用

onDestory()方法会在服务销毁的时候调用(回收不再使用的资源)

需要在AndroidManifest.xml文件中注册才能生效

启动和停止服务

主要也是借助Intent来实现的

启动服务

startService(new Intent(this,MyService.class))

停止服务

stopService(new Intent(this,MyService.class))

如果我们想要让服务自己停止下来,只需要在MyService的任何一个位置调用stopSelf()方法就能让这个服务停止下来

服务和活动之间通信

为了让服务和活动更加紧密一点。

首先在Activity中创建一个ServiceConnection的匿名类,在里面重写了OnServiceConnected()方法和onServiceDisconnected()方法。

绑定服务我们调用的是(BIND_AUTO_CREATE表示活动和服务进行绑定后自动创建服务)

bindService(intent,connection,BIND_AUTO_CREATE);

解除绑定

unbindService(connection)

这个时候要用到的是onBind()方法。这里返回的对象会在onServiceDisconnected()这个第二参数中,

服务的生命周期

onCreate() 服务之前没有创建过就会先执行

onStartCommand()方法执行每次调用startService()就会执行。但是还是只存在一个实例

onBind():在Context的bindService()调用时就会执行该方法

onDestory(): 调用startService后再调用stopService()时就会执行,调用bindService 后又调用unbindService()也会执行

当调用了startService()又调用bindService()此时只有当两个同时调用stopService和unbindService().onDestory()才会执行。

使用前台服务

前台服务和普通服务最大的区别在于,它会一直有一个正在运行的图标在系统状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果。比如:墨迹天气,它的服务后台更新天气数据的同时,还会在系统状态栏一直显示当前的天气信息

IntentService

Android中的Service是用于后台服务的,当应用程序被挂到后台的时候,

为了保证应用某些组件仍然可以工作而引入了Service这个概念,

那么这里面要强调的是Service不是独立的进程,也不是独立的线程,

它是依赖于应用程序的主线程的,也就是说,在更多时候

不建议在Service中编写耗时的逻辑和操作,否则会引起ANR(Application Not Responding)。

那么我们当我们编写的耗时逻辑,不得不被service来管理的时候,

在Service启动一个新子线程,在子线程完成耗时操作。

就需要引入IntentService

IntentService是继承Service的,那么它包含了Service的全部特性,当然也包含service的生命周期,

那么与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程

去你执行你的耗时操作。该线程保证同一时刻只处理一个Intent.这样IntentService不会阻塞主线程。

IntentService的使用和Service是类似。它需要重写

onHandleIntent(Intent intent)方法。

内容提供器Content Provider

内容提供器简介

当系统部署多个Android应用之后,有时候就需要在不同的应用之间共享数据,比如现在有一个短信接收应用,用户想把接收到的陌生短信的发信人添加到联系人管理应用中,就需要不同应用之间共享数据。对于这种需要在不同应用之间共享数据的需求,可以让一个应用程序直接去操作另外一个应用程序所记录的数据

1 比如操作它所记录的SharedPreferences,文件

或数据库等。这种方式显得太杂乱了。

2 不同

应用程序记录数据的方式差别很大,这种方式

不利于应用程序之间进行数据交换。

为了在应用程序之间交换数据,Android提供

了ContentProvider,ContentProvider是不同应用程序之间进行数据交换的标准API,

当一个应用程序需要把自己的数据暴露给其他程序使用时,

该应用程序就可通过提供ContentProvider来实现,其他应用程序可通过ContentResolver

来操作ContentProvider暴露的数据,

包括增加数据

删除数据

修改数据

查询数据等。

ContentProvider也是Android应用的四大组件之一,需要在AndroidManifest.xml文件中进行配置.

Android已经为常见的一些数据提供了默认的ContentProvider.

比如说短信,电话,多媒体等

开发ContentProvider

:定义自己的ContentProvider类,该类继承ContentProvider基类

:暴露ContentProvider提供的数据

  • 重写onCreate():该方法在ContentProvider创建后被调用

    重写getType():该方法用于返回当前Uri所代表的数据的MIME类型,

    如果该Uri对应的数据可能包括多条记录,那么MIME类型

    字符串应用以vnd.android.cursor.dir/开始

    如果该Uri对应的数据只包括一条记录,那么MIME类型

    字符串应用以vnd.android.cursor.item/开始

    重写insert(Uri,ContentValue values):根据Uri插入values对应的数据

    重写delete(Uri,String selection,String[] selectArgs):根据Uri删除select条件匹配的全部记录

    重写update():根据Uri修改select条件所匹配的全部记录

    重写query():根据Uri查询出select条件所匹配的全部记录

    注意:重写的这些方法并不是给该应用本身调用的,

    而是供其他应用来调用。

    第三步:在AndroidManifest.xml文件中注册该ContentProvider,

    指定android:authorities属性

Android基础知识总结的更多相关文章

  1. 【Xamarin开发 Android 系列 4】 Android 基础知识

    原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...

  2. Android基础知识巩固:关于PendingIntent和广播

    平时使用广播的场合比较多,但细节的东西,看过了也没有总结,以至于某些场合有小问题,还是要把原理和属性搞清楚才能运用自如. 其实也是自己比较懒,先看别人的blog,有个概念再去官网看英文的能好理解一些. ...

  3. Android基础知识(一)

    前言 前言 从软件测试最终目的发现问题缺陷来看,Findyou比较认同一个观念,测试的能力大致可以划分成三个能力层次:发现问题.定位问题.预防问题.有机会探讨一下这个分类. 发现问题各种方式方法,比如 ...

  4. android开发学习---linux下开发环境的搭建&& android基础知识介绍

    一.配置所需开发环境 1.基本环境配置 JDK 5或以上版本(仅有JRE不够) (http://www.oracle.com/technetwork/java/javase/downloads/ind ...

  5. Android基础知识-1

    1.Android的Activity任务栈 在Android的系统中,在APP运行时每个APP都会默认有一个任务栈,任务栈的名称以APP的包名命名.任务栈是一中先进后出的结构,APP中每一个调用的Ac ...

  6. 看看android基础知识,谁帮我作答

    无论怎么着,了解一点android的基本知识还是有必要的,就当开阔一些自己的眼界吧. .. . android的四大功能组件是_activity_,_service_,_BroadcastReceiv ...

  7. Android基础知识学习

    IPC  (Inter-Process Communication) 意思是: 进程间的通信,是指两个进程之间进行数据交换的过程. Android中如何开启多进程呢? 只需要给四大组件(Activit ...

  8. Android基础知识之Manifest文件的组织结构

    原文:http://android.eoe.cn/topic/android_sdk 是AndroidManifest.xml文件中的根标签,她必须包含一个标签和指定的xmlns:android. p ...

  9. Android基础知识之拼写检查框架

    原文:http://android.eoe.cn/topic/android_sdk 拼写检查器框架 Android平台提供了一个拼写检查器的框架,来方便你在你的应用中实现并使用拼写检查.这个框架是A ...

  10. android基础知识:SharedPreferences和PreferenceActivity

    1.android文件存储 对Android系统了解的都知道,Android系统有四种基本的数据保存方法,一是SharedPreference,二是文件,三是SQLite,四是ContentProvi ...

随机推荐

  1. [转]Linq中使用Left Join

    本文转自:http://www.cnblogs.com/xinjian/archive/2010/11/17/1879959.html use Test Create table Student( I ...

  2. MordenPHP阅读笔记(一)——先跑再说,跑累了再走

    ---恢复内容开始--- 后台一大堆半成品,或者是几乎不成的... 这本书不错,起码是别人推荐的,然后也是比较新的东西,学哪本不是学嘛,关键是得看. 今儿个网不好,科研所需的代码下不到,看书做笔记吧. ...

  3. C#基础---C#如何对Json字符串处理

    Json字符串对于做web应用的应该很熟悉,其实在很多请求我们返回的都是Json字符串.那对于C#代码如何处理Json字符串呢,.Net封装了一个类叫做JavaScriptSerializer[MSD ...

  4. MMORPG大型游戏设计与开发(构架)

    游戏整体是以经典的武侠世界/天龙八部作为基本的一种设计模式,大致分为以下几个部分. 游戏的简单的一次处理流程如下,不过有些凌乱,还有待完善. 程序设计方面,服务器基本上分为数据处理.日志.网络等模块, ...

  5. LInux_System_Call_INT_80h

    Int 80h Website (Copy from Linux-System-Call) List of Linux/i386 system calls Copyright (C) 1999-200 ...

  6. HDU2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活[多重背包]

    悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  7. red5安装时候出现服务不能启动异常

    Exception java.lang.ClassCastException: org.slf4j.helpers.BasicMDCAdapter cannot be cast to ch.qos.l ...

  8. Zygote进程【1】——Zygote的诞生

    在Android中存在着C和Java两个完全不同的世界,前者直接建立在Linux的基础上,后者直接建立在JVM的基础上.zygote的中文名字为"受精卵",这个名字很好的诠释了zy ...

  9. javascript中使用循环链表实现约瑟夫环问题

    1.问题 传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围.犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案.他们围成一个圈,从一个人开始,数到第 ...

  10. @OBJC 和 DYNAMIC

    原文转载自:@OBJC 和 DYNAMIC 虽然说 Swift 语言的初衷是希望能摆脱 Objective-C 的沉重的历史包袱和约束,但是不可否认的是经过了二十多年的洗礼,Cocoa 框架早就烙上了 ...