四大组件之一活动

活动状态

运行状态:活动处于栈顶

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

停止状态:完全不可见

销毁状态:离开返回栈

生存期

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. 买错的电影票,含着泪也得看-LAMP搭建&Linux基础

    hi 没说过,上周五室友过生请客,在龙湖里吃嗨了喝爽了,回去的路上侃侃而谈.说好的这周一起去看年内最后的大片,火星救援的,谁知道老子眼神不好,买错了电影的时间...把周六的约定提前到了今儿个下午,ma ...

  2. 转载:学习Entity Framework 中的Code First

    看完觉得不错,适合作为学习资料,就转载过来了 原文链接:http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html 这是上周就写 ...

  3. codeforces118D. Caesar's Legions

    地址:http://www.codeforces.com/problemset/problem/118/D 题目: Gaius Julius Caesar, a famous general, lov ...

  4. [No00001B]到底如何培养语感?

  5. java 25 - 3 网络编程之 Socket套接字

    Socket Socket套接字: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. Socket原理机制: 通信的两端都有Socket. 网络通信其实就是Socket ...

  6. MySQL日志管理

    MySQL日志管理 2013年09月26日 ⁄ MySQL ⁄ 共 14266字 ⁄ 评论数 ⁄ 被围观 , views+ 一.日志类型: MySQL有几个不同的日志文件,可以帮助你找出mysqld内 ...

  7. 10 Things Every Java Programmer Should Know about String

    String in Java is very special class and most frequently used class as well. There are lot many thin ...

  8. 50个查询系列-第13个查询:把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;

    UPDATE tblscore SET tblscore.Score= ( -- 这里开始算叶平的平均值 SELECT AVG(tt.aa) FROM ( SELECT tblscore.Score ...

  9. sql server利用开窗函数over() 进行分组统计

    这是一道常见的面试题,在实际项目中经常会用到. 需求:求出以产品类别为分组,各个分组里价格最高的产品信息. 实现过程如下: declare @t table( ProductID int, Produ ...

  10. TM4C123G红外触摸屏:开发板好不容易实现了原理,放到专家设计的板子上无法运行,于是专家跑路项目黄了

    使用TI的TM4C123G LaunchPad开发板,USB接口,来对同样的芯片进行烧写. 我们只用烧写那一块功能,不用另外一个芯片的开发功能,需要跳线   源码项目:   从官方网站TM4C123G ...