Android笔记

在 Activity 获取字符串资源:

this.getString(R.string.hello)

从 Context 获取字符串资源:

context.getString(R.string.hello)

从 Application 获取字符串资源:

application.getString(R.string.hello)

--------------------------------------------------------------------------------------------

Android以两种不同的开源许可发布。

Linux内核是GPL发布,开源OS需要该授权。

Android平台(不含内核)由Apache发布。两种发布模式都是开源为主,不同是后者面向商业用途。

Dalvik VM和JVM的比较

区别jvm                dalvik vm

编译后文件格式.java->.class->.jar  .java->.class->.dex->.odex

基于的架构基于栈的架构基于寄存器的架构

Odex化即是把那个文件预先提取出来作用是能加快软件加载速度和开机速度。

Activity, ContentProvider, Service, BroadcastReceiver.

android中的四大组件,都需要在清单文件中声明

----------------------------------------------------------------------------------------------

常见命令操作(需要配置adb.exe的环境变量)

adb devices列出所有的设备

adb start-server开启adb服务

adb kill-server关闭adb服务

adb logcat查看Log

adb shell挂载到Linux的空间

adb install <应用程序(加扩展名)>安装应用程序

adb–s <模拟器名称>  install  <应用程序(加扩展名)>安装应用到指定模拟器

adb uninstall <程序包名>

adb pull

adb push

emulator–avd <模拟器名称>

ctrl + F11横竖屏的切换

----------------------------------------------------------------------------------------------

【★★★】

五大布局Layout:

LinearLayout线性布局

RelativeLayout相对布局

AbsoluteLayout绝对布局

TableLayout表格布局

FrameLayout帧布局

----------------------------------------------------------------------------------------------

【★★★★★】

应用程序架构

src  java原代码存放目录

gen自动生成目录

目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件。 这个文件由Android开发工具自动产生的。

Android开发工具会自动根据你放入res目录的资源,同步更新修改R.java文件。正因为R.java文件是由开发工具自动生成的,

所以我们应避免手工修改R.java。R.java在应用中起到了字典的作用,它包含了各种资源的id,通过R.java,

应用可以很方便地找到对应资源。另外编绎器也会检查R.java列表中的资源是否被使用到,

没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。

res资源(Resource)目录

在这个目录中我们可以存放应用使用到的各种资源,如xml界面文件,图片或数据。具体请看ppt下方备注栏。

libs支持库目录

程序开发时需要的一些三方的jar包可以放在这个目录,系统会自动把里面的jar包,添加到环境变量。

assets资源目录

Android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件,

而且/assets目录下的资源文件不会在R.java自动生成ID,

所以读取/assets目录下的文件必须指定文件的路径,如:file:///android_asset/xxx.3gp

AndroidManifest.xml项目清单文件

这个文件列出了应用程序所提供的功能,以后你开发好的各种组件需要在该文件中进行配置,

如果应用使用到了系统内置的应用(如电话服务、互联网服务、短信服务、GPS服务等等),你还需在该文件中声明使用权限。

project.properties项目环境信息,一般是不需要修改此文件

----------------------------------------------------------------------------------------------

【★★★★★】

ContentProvider(内容提供者)

ContentProvider内容提供者,共享数据的好处是统一了数据访问的方式:

ContentProvider内容提供者部分:

1.声明Provider,注册authority主机名.

2.在内容提供者的静态代码块static中,添加分机号,添加分支.

UriMatcher提供添加分支和匹配分支.

uriMatcher.addUri

3.对已经添加的分支,进行分别实现.

UriMatcher类的使用简介:

withAppendedId(uri, id),parseId(uri)

ContentUris获取和添加Uri信息

另一个程序(查询别人的内容提供者):

1. ContentResolver对象.

2.使用ContentResolver对象根据Uri进行访问另一个程序的内容提供者.

ContentResolver用于调用内容提供者

1).查询手机短信.content://sms/操作的就是系统短信数据库中sms表.

2).插入手机短信.

操作短信需要的权限:

----------------------------------------------------------------------------------------------

【★★★★★】

Activity

①,生命周期:onCreate(),onStart(),onPause(),onRestart(),onStop(),onDestroy

②, activity的三种状态

停止状态:当它完全被另一个Activity覆盖时则.

暂停状态:当它上面有另外一个Activity,使它失去了焦点但仍然对用户可见时.

激活或运行状态:当它在屏幕前台时,响应用户操作的Activity.

③,跳转到新的Activity

1,显式开启(需要有Activity类对象):

Intent intent = new Intent(MainActivity.this, NewActivity.class);

Intent.putExtra(“name”,“zhangsan”);

startActivity(intent);

使用意图传递参数(参数类型可以是基本类型和实现序列化接口的类)

2,隐式开启(只知道其动作(action),类型(mimeType)和附加信息):

例如跳转到系统中浏览器:

Intent intent = new Intent()

setAction("android.intent.action.VIEW")

addCategory("android.intent.category.DEFAULT")该步可以不写,系统默认

addCategory("android.intent.category.BROWSABLE")

setData(Uri.parse("http://www.baidu.com")),

startActivity(intent).

④,得到新打开Activity关闭后返回的数据

1,startActivityForResult(Intent intent, int requestCode)方法打开新的Activity

2,前面的Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法

⑤,Activity的启动模式

在清单文件(AndroidManifest.xml)文件中的activity节点里有个属性android:launchMode就是指定Activity的启动模式

1,standard标准模式(默认):

当前activity可以被多次实例化,并且可以在一个任务栈中存在多个当前对象.

2,singleTop单顶部模式:

如果当前activity在任务栈的顶部,系统就不会初始化一个activity,

而是调用当前activity的onNewIntent方法.如果不在任务栈的顶部,则会初始化一个实例.

3,singleTask单任务模式:

如果当前activity已经在任务栈中,那么系统就不会创建新的,

而是调用当前activity的onNewIntent方法,并且把当前activity所有以上的activity都清除,使其显示.

4,singleInstance单例模式:

在创建单例模式的activity时,会单独创建一个任务栈为其使用,并且这个任务栈只有它自己在里边.

如果当前activity已经被创建,那么会调用onNewIntent方法.

---------------------------------------------------------------------------------------------------------

【★★★★★】

BroadcastReceiver组件(广播接收者)

①,广播接收者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用sendBroadcast(),

sendOrderedBroadcast()来实现的.通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收.

②,要实现一个广播接收者方法如下:

1,继承BroadcastReceiver,并重写onReceive()方法。

2,订阅感兴趣的广播Intent,订阅方法有两种:

1,使用代码进行订阅

IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

IncomingSMSReceiver receiver = new IncomingSMSReceiver();

registerReceiver(receiver, filter);

2,在AndroidManifest.xml文件中的节点里进行订阅:

③,拦截拨打电话广播

拦截动作: android.intent.action.NEW_OUTGOING_CALL

需要权限: android.permission.PROCESS_OUTGOING_CALLS

监听SD卡卸载广播

拦截动作: android.intent.action.MEDIA_UNMOUNTED

指定scheme: file

短信拦截(android 4.2后废除了此action)

拦截动作: android.provider.Telephony.SMS_RECEIVED

优先级别设置为最大,在系统收到短信之前接收短信:priority="1000“

需要权限: android.permission.RECEIVE_SMS

---------------------------------------------------------------------------------------------------------

【★★★★★】

Service组件

①,Android中的服务Service:

和Activity不同的是不能与用户交互的,不能自己启动,系统的后台运行,

当程序退出时,我们没有显示的调用停止服务,那么这个Service就没有结束,它仍然在后台运行。

Service和其他组件一样,都是运行在主线程中,因此不能用它来做耗时的操作。

②,服务一般分为两种:

1,本地服务,

用于应用程序内部,在Service可以调用startService()启动,调用stopService()结束,

无论调用了多少次startService(),都只需调用一次stopService()来停止,采用startService()方法启动服务,

只能调用stopService()方法结束服务,服务结束时会调用onDestroy()方法。

生命周期:startService-->(onCreate->onStart)--Service is running --stopService()-->(onDestroy)-->Service is shut down.

2,远程服务,

用于系统内部的应用程序之间,可以定义接口并把接口暴露出来,以便其他应用进行操作,

客户端建立到服务对象的连接,并通过那个连接来调用服务,调用bindService()方法建立连接,

并启动,以调用unbindService()关闭连接,多个客户端可以绑定至同一个服务。

生命周期:bindService()-->(onCreate->onBind)--Client interacts width the Service--onUnbind()-->onDestroy()-->Service is shut down

--------------------------------------------------------------------------------------------------------

【★★★★】

多线程断点续传下载:

首先得到下载文件的长度,然后设置本地文件的长度。

HttpURLConnection.getContentLength(),RandomAccessFile,file.setLength(filesize);

根据文件长度和线程数计算每条线程下载的数据长度和下载位置。

使用Http的Range头字段指定每条线程从文件的什么位置开始下载,下载到什么位置为止.

HttpURLConnection.setRequestProperty("Range", "bytes=2097152-4194303");

保存文件

RandomAccessFile threadfile = new RandomAccessFile("QQWubiSetup.exe ","rwd");

threadfile.seek(2097152);

---------------------------------------------------------------------------------------------------------

Intent

---------------------------------------------------------------------------------------------------------

【★★★★★】

数据存储与访问

Android为数据存储提供了如下几种方式:

①,文件:

上下文中有openFileOutput(),创建的文件保存在/data/data//files目录.

Activity还提供了getCacheDir()和getFilesDir()方法,文件是存放在手机空间上:

getCacheDir()方法用于获取/data/data//cache目录

getFilesDir()方法用于获取/data/data//files目录

一般将文件存放到手机sd卡,先判断是否有SD卡:

获取SDCard的状态:Environment.getExternalStorageState(),Environment.MEDIA_MOUNTED。(rw)

获取SDCard的目录,Environment.getExternalStorageDirectory()方法用于当然要获取SDCard的目录,

sd卡读的权限:

sd卡的写的权限:

Pull解析器生成XML文件:

---------------------------------------------------------------------------------------------------------

②,SharedPreferences(参数):

保存软件配置参数的方式:

window软件通常我们会采用ini文件进行保存,

如果是j2se应用,我们会采用properties属性文件或者xml进行保存。

如果是Android应用,Android平台SharedPreferences类,轻量级的存储类,特别适合用于保存软件配置参数。

使用SharedPreferences保存数据,其背后是用xml文件存放数据,

文件存放在/data/data//shared_prefs目录下

存数据:

1.需要先获得SharedPreferences对象,getSharedPreferences

2.获得Editor编辑器对象,sharedPreferences.edit()

3.使用编辑器对象存储数据.

4.使用编辑器对象调用commit方法,提交存储的数据到本地.

取数据:

1.需要先获得SharedPreferences对象

2.使用SharedPreferences对象get文件中的数据.

---------------------------------------------------------------------------------------------------------

③,SQLite数据库:是一款轻量型的数据库,是遵守ACID(原子性、一致性、隔离性、持久性)的关联式数据库管理系统,多用于嵌入式开发中。

android数据库创建的位置: /data/data/包名/databases/itheima30.db

dao database access object数据库访问对象

execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句;

rawQuery()方法用于执行select语句。

SQLiteDatabase操作SQLite数据库:

SQLiteDatabase db = new SQLiteDatabase();

Cursor cursor = db.rawQuery("select * from person ",null);

cursor.moveToNext(),cursor.getInt(),cursor.getString(),cursor.close()

Cursor是结果集游标,用于对结果集进行随机访问,其实Cursor与JDBC中的ResultSet作用很相似。

sqlite3命令使用:

.table列出数据库所有的表

.mode column指定查询出来的结果以列的方式展示

.exit退出sqlite编辑模式

更新SQLite数据库版本.可修改表结构: alter table person add balance integer;

事物的操作:

开启事物:db.beginTransaction();

设置回滚点:db.setTransactionSuccessful();

结束事物:db.endTransaction();

---------------------------------------------------------------------------------------------------------------

④,网络

---------------------------------------------------------------------------------------------------------------

进程的生命周期

内存回收机制.会根据优先级进行回收.

1. Foreground process前台进程用户正在操作的应用程序的进程.

2. Visible process可视进程  用户可以看到,但无法进行操作的应用程序的进程.

3. Service process服务进程  后台运行的服务.

4. Background process后台进程  最小化应用程序,托管到后台运行.

5. Empty process空进程    已经退出的程序,没有任务在运行.

--------------------------------------------------------------------------------------------------------------------------------

【★★★】

图型处理

①,加载大图

假设一张图片的规格是: 3648x2736

这张图片加载到手机中需要的内存为19M, android的DVM虚拟机的堆(HEAP)内存默认情况下16M(部分手机除外),这时候加载这一张图片内存就溢出了.

java代码可以处理的就是对其进行比例缩放

图片的宽度/屏幕的宽度=宽度缩放比例

3648 / 320 = 11.4

图片的高度/屏幕的高度=高度缩放比例,以上两个比例,哪一个大就采用哪一个缩放比例.

②, ExifInterface用于读取图片的属性信息.

③,在系统的图库中选择图片:

Intent intent = new Intent("android.intent.action.PICK");

intent.setType("image/*");

startActivityForResult(intent, 0);

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if(resultCode == Activity.RESULT_OK) {

Uri uri = data.getData();

iv.setImageURI(uri);

}

}

④,手动绘制图片:

Android提供了两个类Canvas和Paint.

Canvas画画板用于绘制各种图形(点,线,圆,矩形等等).

Paint画笔和Canvas搭配使用,用于指定绘制的颜色,线条的粗细,过渡,渐变等效果.

⑤,图型处理

图形的默认矩阵用数组表示为:x,y,z轴

{ 1, 0, 0,表示向量x = 1x + 0y + 0z

0, 1, 0,表示向量y = 0x + 1y + 0z

0, 0, 1 }表示向量z = 0x + 0y + 1z

缩放{ 2, 0, 0,x轴所有的像素点放大2倍,展现的效是:图片宽度x2

镜面{ -1, 0, 0,x轴所有的像素点沿负数方向反过来,展现的效果是:镜面

倒影0, -1, 0,y轴所有的像素点沿负数方向反过来,展现的效果是:倒影

-------------------------------------------------------------------------------------------------

【★★★】

多媒体

①,录音(MediaRecorder ):

1,权限:android.permission.RECORD_AUDIO

2,构造方法直接new音频对象,设置采集声音源,输出格式,编码,存储路径,准备,开始,停止,重置,释放资源

设置setAudioSource(MIC),setOutputFormat(THREE_GPP),setAudioEncoder(AMR_NB),setOutputFile(),prepare(),start()-->stop(),reset(),release()

②,播放音乐(MediaPlayer):

1,reset(),setAudioStreamType(AudioManager.STREAM_MUSIC),setDataSource(),prepare(),start(),pause(),start(),stop(),release()

2,构造方法new对象,重置为初始状态,设置音频源文件,准备,开始或恢复播放,暂停播放,恢复播放,停止播放,释放资源

播放音乐(SoundPool):

1,new SoundPool(3, AudioManager.STREAM_MUSIC, 0),load(),play().

2,小声音(1M),构造new对象,

③,播放视频(MediaPlayer):SurfaceView

1,Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前

surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

new MediaPlayer(),reset(),setAudioStreamType(AudioManager.STREAM_MUSIC),

setDisplay(surfaceView.getHolder())

setDataSource("/mnt/sdcard/oppo.mp4"),prepare(),start(),pause(),start(),stop(),release().

构造new对象,重置为初始状态,设置音频流类型,设置画面显示为surfaceView,设置数据源,准备,播放,暂停,恢复播放,停止,释放资源

---------------------------------------------------------------------------------------------------

【★★★】

摄像头的使用(Camera)

①,采集图像

1,权限(摄像应用,存储卡写)

android.permission.CAMERA

android.permission.WRITE_EXTERNAL_STORAGE

2,通过SurfaceView预览,预览画面的帮助类surfaceView.getHolder(),设置数据来源自渲染引擎, addCallback()预览改变调用此方法,不使用自己的缓冲区holder.setType.

Camera.open(),camera.setPreviewDisplay(holder),startPreview(),takePicture(null, null, pictureCallback),stopPreview(),release().

打开摄像头,设置预览显示,开始预览,拍照,停止预览,释放资源

autoFocus(),自动对焦

activity节点下,android:screenOrientation="landscape"属性,可以调节预览画面横竖屏切换

②,录制视频

1,需要权限(摄像应用,存储卡写,录音)

android.permission.CAMERA

android.permission.RECORD_AUDIO

android.permission.WRITE_EXTERNAL_STORAGE

如果录制前后需要预览效果,需要在录制开始前停止预览,并解锁摄像头,录制停止后锁上摄像头,再开始预览.

2,new MediaRecorder(),setCamera(camera),setAudioSource(CAMCORDER),setVideoSource(CAMERA),

CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);获得摄像质量低的配置

setProfile(profile),setOutputFile(“/mnt/sdcard/test.mp4”),

setPreviewDisplay(mHolder.getSurface()),prepare(),start(),stop(),release().

构造new对象(MediaRecorder),关联摄像头,设置音频源,设置视频源,获得摄像质量低的配置,

设置配置文件,设置输出文件,设置预览显示,准备,录制,停止,释放资源

③,调用系统摄像头

1,拍照

intent.setAction("android.media.action.VIDEO_CAPTURE");

定义一个标识符指向一个文件Uri uri = Uri.fromFile(new File("/mnt/sdcard/itheima30.mp4"));

拍完照片之后,存储的位置.intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

2,录像

intent.setAction("android.media.action.VIDEO_CAPTURE");

定义一个标识符指向一个文件Uri uri = Uri.fromFile(new File("/mnt/sdcard/itheima30.mp4"));

拍完照片之后,存储的位置.intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

------------------------------------------------------------------------------------------------------

【★★★★】

对话框(AlertDialog)

Builder builder = new Builder(this);

①,通知对话框

setIcon(),setTitle(),setMessage(),setCancelable(false),setPositiveButton,setNegativeButton,show().

②,列表对话框

setIcon(),setTitle(),setCancelable(false),setItems(),show().

③,单选对话框

setIcon(),setTitle(),setCancelable(false),setSingleChoiceItems(),setPositiveButton(),show().

④,多选对话框

setIcon(),setTitle(),setCancelable(false),setMultiChoiceItems(),show().

⑤,进度对话框

new ProgressDialog(),setIcon(),setTitle(),setMax(),setProgressStyle(),setMessage(),show().

------------------------------------------------------------------------------------------------------

拖动条(SeekBar)

SeekBar.getProgress()获取拖动条当前值

调用setOnSeekBarChangeListener()方法,处理拖动条值变化事件,把SeekBar.OnSeekBarChangeListener实例作为参数传入

进度条(ProgressBar)

ProgressBar.setMax(100);

ProgressBar.setProgress(0);

--------------------------------------------------------------------------------------------------------

传感器(Sensor)

①,传感器类型:方向、加速度(重力)、光线、磁场、距离(临近性)、温度等。

方向传感器:Sensor.TYPE_ORIENTATION

加速度(重力)传感器:Sensor.TYPE_ACCELEROMETER

光线传感器:    Sensor.TYPE_LIGHT

磁场传感器:Sensor.TYPE_MAGNETIC_FIELD

距离(临近性)传感器:Sensor.TYPE_PROXIMITY

温度传感器:Sensor.TYPE_TEMPERATURE

②,获取某种类型的感应器

Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

注册监听,获取传感器变化值

sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_GAME);

上面第三个参数为采样率:最快、游戏、普通、用户界面。当应用程序请求特定的采样率时,其实只是对传感器子系统的一个建议,不保证特定的采样率可用。

最快:SensorManager.SENSOR_DELAY_FASTEST

最低延迟,一般不是特别敏感的处理不推荐使用,该种模式可能造成手机电力大量消耗,由于传递的为原始数据,算法不处理好将会影响游戏逻辑和UI的性能。

游戏:SensorManager.SENSOR_DELAY_GAME

游戏延迟,一般绝大多数的实时性较高的游戏都使用该级别。

普通:SensorManager.SENSOR_DELAY_NORMAL

标准延迟,对于一般的益智类或EASY级别的游戏可以使用,但过低的采样率可能对一些赛车类游戏有跳帧现象。

用户界面:SensorManager.SENSOR_DELAY_UI

一般对于屏幕方向自动旋转使用,相对节省电能和逻辑处理,一般游戏开发中我们不使用。

--------------------------------------------------------------------------------------------------------

动画(Animation)

Android提供了2种动画:

①,补间动画(Tween),通过对View的内容进行一系列的图形变换来实现动画效果。

动画效果的定义可以采用XML来做也可以采用编码来做。

Tween动画有4种类型:

平移:translate

缩放:scale

旋转:rotate

渐变:alpha

②,帧动画(Frame),即顺序播放事先做好的图像,跟放胶片电影类似。开发步骤:

1,把准备好的图片放进项目res/ drawable下。

2,在项目的res目录下创建文件夹anim,然后在anim文件夹下面定义动画XML文件,文件名称可以自定义。

当然也可以采用编码方式定义动画效果(使用AnimationDrawable类)。

3,为View控件绑定动画效果。调用代表动画的AnimationDrawable的start()方法开始动画。

--------------------------------------------------------------------------------------------------------

状态栏通知(Notification)

通过通知管理器NotificationManger.getSystemService得到通知管理器对象,用于弹出状态栏通知。

Notification notification = new Notification(...);

Intent指向需要跳转的页面

notification.setLatestEventInfo()

设置通知的标识为,点一次被关闭

notification.flags = Notification.FLAG_FOREGROUND_SERVICE;

设置通知的声音为系统短信的铃声

notification.defaults = Notification.DEFAULT_SOUND;

弹出通知, id为0

nm.notify(0, notification);

--------------------------------------------------------------------------------------------------------

菜单(Menu)

当第一次创建菜单时回调此方法(onCreateOptionsMenu),创建完菜单后,此方法以后无论点击多少此menu按钮都不会再执行。

菜单项MenuItem对菜单子条目进行添加管理。在创建菜单时,可以在onCreateOptionsMenu方法里

面调用打气筒器(MenuInflater)直接填充menu目录下的xml格式填充菜单布局。

OptionMenu

MenuInflater把一个menu菜单的布局转换成一个menu对象

LayoutInflater把layout布局转换成一个view对象

--------------------------------------------------------------------------------------------------------

【★★★】

自定义样式(Style)

指定在控件和布局上的.

作用就是:把某些相同或者类似的控件的相同的属性抽取出来,定义一个样式.

好处1:代码可读性高.

好处2:统一管理.只改一处就可以了.

--------------------------------------------------------------------------------------------------------

下拉框和自动提示文本(内容比较细,要用上网查,回头找)

下拉框(Spinner)

自动完成文本框(AutoCompleteTextView )

WebView使用

loadUrl,WebSettings,setBuiltInZoomControls,setUseWideViewPort,setWebViewClient,onBackPressed

加载Url,获得参数设置对象,拖动时放大缩小,双击时放大缩小,加载新的Url时,点击返回

--------------------------------------------------------------------------------------------------------

【★★★★★】

Fragment(片段)使用:

3.0以后版本推出的Fragment,所以API兼容最低为11.

activity片段化,Fragment看成一个小的activity, activity可以包含多个Fragment。

在MainActivity对应的XML文件中“注册”fragment。在一个继承Fragment的Java类中,我们复写onCreateView()方法。

当创建view时回调此方法,返回的view对象就是当前Fragment的布局。

Fragment生命周期方法:

onAttach当Fragment绑定在Activity时执行

onCreate当Fragment创建时执行

onCreateView Fragment创建布局【★】

onActivityCreated当Activity创建完成时.

onStart Fragment开启

onResume当Fragment获取焦点时回调,这时候Fragment已经可以和用户交互了.

onPauseFragment暂停时.

onStop  Fragment停止

onDestroyView Fragment销毁布局时

onDestroy Fragment销毁

onDetach把当前Fragment从Activity中解绑

两个fragment之间通信

通过getActivity().getFragmentManager().findFragmentById()拿到通信的另外一个fragment

--------------------------------------------------------------------------------------------------------


--------------------------------------------------------------------------------------------------------

③,关于签名

我们的Android系统规定,只能存在一个同名包;

假如我们已经安装了某个包,再想安装同名包的话,就需要覆盖;

例如:A程序开发了一个A应用 :com.xxx.a;

它已经安装在我们的手机上了

B程序员开发了一款B应用:com.xxx.a;

1、校验两个程序的包名是否一样;

2、签名

---才能做到覆盖安装

为什么模拟器,可以直接运行安装呢?

我们模拟器apk,其实已经是签名了的:默认的签名;

默认的签名,每一台电脑是一样的吗?

不一样的。

为什么要签名?

1.你不签名,不能上传到应用市场上去;

2.我们本身的应用也是需要特性;

如何签名?

只有签名后才能发布到应用市场。

签名:时间写50年

签名丢怎么样去解决;

1.重新签名;----如果有新版本了,就提示卸载老版本,然后再让他下载版本;

2.改包名--新的软件了

--重新签名;

3.签名&包名--升级--我们的手机里两款应用---新版本里面,写一个代码卸载老版本;

--------------------------------------------------------------------------------------------------------

④,自定义属性的过程

1,声明一个View对象,这个view继承相对布局,或者线性布局;ViewGroup;

2,实现父类(相对布局)的构造方法,并且在构造方法里初始化布局(initView(View view));

3,更新需要和业务逻辑,增加一些api方法,扩展自定义组合控件。

4,要自定义属性;

5,自定义一个命名空间http://schemas.android.com/apk/res/com.itheima.mobilesafe;

6,在res的values目录下描述自定义属性的文件

7,在布局文件里写你要用的哪些属性

8,在只有两个参数的构造方法里 有一个类AttributeSet attrs封装了所以属性的信息。

获取自定义的属性信息。

--------------------------------------------------------------------------------------------------------

⑤,请求网络的代码(检查版本)

URL url = new URL(getString(R.string.serviceurl));

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setRequestMethod("GET");

conn.setReadTimeout(5000);

conn.getInputStream(is)

参照一个解析流的类StreamTools

解析JSON

JSONObject obj = new JSONObject(result);

//服务器的版本号

String version = (String) obj.get("version");

description = (String) obj.get("description");

apkurl = (String) obj.get("apkurl");

用Handler更新信息

--------------------------------------------------------------------------------------------------------

⑥,调用系统安装工具安装APK

private void installAPK(File t) {

Intent intent = new Intent();

intent.setAction("android.intent.action.INSTALL_PACKAGE" );

intent.addCategory("android.intent.category.DEFAULT");

intent.setDataAndType(Uri.fromFile(t), "application/vnd.android.package-archive");

startActivity(intent);

}

--------------------------------------------------------------------------------------------------------

⑨,两种上下文的区别

对话框是Activity的一部分,对话框是挂载在Activity上面的 。

如果Activity不存在,对话框就不能被创建。

Activity实际上是应用程序context上下文的一个子集。

子类有的东西父类不一定有,父类有的东西子类一定有

getApplicationContext();生命周期长,只要应用还存活它就存在;

this生命周期短,只要Activity不存在了,系统就会回收;

其中:getBaseContext(),getApplication(),getApplicationContext();

都不能放在AlertDialog做上下文;

getApplicationContext() 使用场景是比如频繁需要操作的数据库,推荐用法:Activity.this

--------------------------------------------------------------------------------------------------------

推荐阅读更多精彩内容