四大组件之一活动

活动状态

运行状态:活动处于栈顶

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

停止状态:完全不可见

销毁状态:离开返回栈

生存期

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. (转)linux下vi命令大全

    http://www.cnblogs.com/88999660/articles/1581524.html 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n ...

  2. Notes on <Assembly Language step by step>

    By brant-ruan Yeah, I feel very happy When you want to give up, think why you have held on so long. ...

  3. stanford coursera 机器学习编程作业 exercise 5(正则化线性回归及偏差和方差)

    本文根据水库中蓄水标线(water level) 使用正则化的线性回归模型预 水流量(water flowing out of dam),然后 debug 学习算法 以及 讨论偏差和方差对 该线性回归 ...

  4. 万能的 SQL编程

    简介:T-SQL语句创建库.创建表和听.和添加约束等.T-SQL是数据库结构化查询语言,常见的增加.删出.修改.查询.创建库和创建表的语句,还支持定义变量.输出语句.逻辑控制语句(IF.CASE.WH ...

  5. Linux强化论:15步打造一个安全的Linux服务器

    Linux强化论:15步打造一个安全的Linux服务器 Alpha_h4ck2016-11-30共28761人围观 ,发现 8 个不明物体专题系统安全 可能大多数人都觉得Linux是安全的吧?但我要告 ...

  6. 使用gulp将移动端px转为rem

    使用gulp的插件可以很方便的将xp转为rem,在布局的时候使用@1x .@2x布局,即10rem=device-width:@1x即设计图为320px,1rem对应的10px像素,相对的@2x即为布 ...

  7. TFS命令tf:undo(强制签入签出文件)

    由于修改计算机名称或不同电脑上操作忘记签入,则需要强制签入文件 具体步骤如下: 1.在命令行中输入"cd  C:\Program Files\Microsoft Visual Studio ...

  8. iOS原生项目中集成React Native

    1.本文的前提条件是,电脑上已经安装了CocoaPods,React Native相关环境. 2.使用Xcode新建一个工程.EmbedRNMeituan [图1] 3.使用CocoaPods安装Re ...

  9. python install

    Install all dependencies by pip install -r requirements.txt (Run this command from project root)

  10. 前端见微知著工具篇:Grunt实现自动化

    转载说明 本篇文章为转载文章,来源为[前端福利]用grunt搭建自动化的web前端开发环境-完整教程,之所以转载,是因为本文写的太详细了,我很想自己来写,但是发现跳不出这篇文章的圈子,因为写的详尽,所 ...