带确定和取消的对话框:
1.AlertDialog,Builer//对话框构建器创建
Alertdialog.Builer builer=newBuiler(this)//this当前上下文
getapplicationContext()也是获取上下文,但这里有问题
2.设置图标,提示框的左上角显示的图标
builder.setIcon()
3.设置是标题
builer.setTitle();
4.设置内容
builer.setMessage();
5.设置按钮样式(一个,两个还是三个)
builder.setPositiveButtion("确定",onClickListener()接口)//带确定的按钮
6.实现接口内方法
浏览网页动作用隐式意图
7.取消的点击事件
builer.setNegativebuttion("取消",newOnClickListener接口,里面的实现为空,就代表用户点击取消对话框
8.创建对话框并显示
Alertdialog dialog=builer.create();//用上面的参数建立一个对话框
dialog.show()//显示对话框
onPause()方法是当当前activity失去焦点的时候调用的方法
对话框不会使当前activity失去焦点,因为对话框是activity的一部分,弹出对话框不会让activity失去焦点,对话框是这个activity的一部分,getApplicationContext没有维护特有activity上下文的信息的,所以Builer这里不能使用getApplicationContext,只能作this
activity.this跟getApplicationContext()
activity.this
代表的是上下文,里面维护的有activity里面的一些环境参数的引用,
getapplicationcontext()
整个应用程序的上下文,维护的引用要比activity.this少,但生命周期比activity长,应用程序的时候
如果想维护长时间的连接可以用例如打开数据库长时间连接时使用getApplicatContext()
单选对话框:
1.AlertDialog,Builer//对话框构建器创建
Alertdialog.Builer builer=newBuiler(this)//当前上下文
getapplicationContext()也是获取上下文,但这里有问题
2.设置图标
builder.setIcon()
3.设置是标题
builer.setTitle();
4.单选的条目
builer.setItems(items,listener);
itmes:字符串数据组,显示的数据
listener:点击事件OnClickListener
5.监听事件的实现
6.创建对话框并显示
Alertdialogdialog=builer.create();//用上面的参数建立一个对话框
dialog.show()//显示对话框
显示带按钮的对话框:
1.AlertDialog,Builer//对话框构建器创建
Alertdialog.Builer builer=newBuiler(this)//当前上下文
getapplicationContext()也是获取上下文,但这里有问题
2.设置图标
builder.setIcon()
3.设置是标题
builer.setTitle();
4.单选带按钮的条目
builer.setSingleChoceItems(items,checkedItem,listener);
items:字符串数据组,显示的数据
listener:点击事件OnClickListener
checkedItem:默认勾选的条目,从零开始
5.监听事件的实现
在这里还要注意一点我们点了某一个条目是不会关闭这个弹出窗的我们需要在点击事件最后用dialog.dismiss()方法关闭窗口
还有一种是dialog.cancel()也可以关闭窗口,实现上都我们调用cancel()程序会判断我们传过去的消息是否为空,如果为空就直接调用dialog.dissmiss()方法,也就是说我们可以dialog.setOnCancelListener()监听cancel()事件,并响应事件
6.创建对话框并显示
Alertdialogdialog=builer.create();//用上面的参数建立一个对话框
dialog.show()//显示对话框
多选对话框:
1.AlertDialog,Builer//对话框构建器创建
Alertdialog.Builer builer=newBuiler(this)//当前上下文
getapplicationContext()也是获取上下文,但这里有问题
2.设置图标
builder.setIcon()
3.设置是标题
builer.setTitle();
4.多选条目
builder.setMultiChoiceItems(items,checkedItems,listener);
itmes:字符串数据组,显示的数据
listener:点击事件OnClickListener
checkedItems:这个是条目选择情况的一个boolean[]数组
在这个接口中有一个onClick的方法,(DialogInterfacedialog,intwhich,booleanisChecked)isChecked参数表示现在条目是否选中
5.监听事件的实现
在这里还要注意一点我们点了某一个条目是不会关闭这个弹出窗的我们需要在点击事件最后用dialog.dismiss()方法关闭窗口
还有一种是dialog.cancel()也可以关闭窗口,实现上都我们调用cancel()程序会判断我们传过去的消息是否为空,如果为空就直接调用dialog.dissmiss()方法,也就是说我们可以dialog.setOnCancelListener()监听cancel()事件,并响应事件
6.取消的点击事件
builer.setNegativebuttion("取消",newOnClickListener接口,里面的实现为空,就代表用户点击取消对话框
7.创建对话框并显示
Alertdialogdialog=builer.create();//用上面的参数建立一个对话框
dialog.show()//显示对话框
进度度对话框
1.进度条对话框
ProgressDialogpd=newProgressDialog(this);
2.设置显示样式默认是不显示具体进度条
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//这是显示的水平进度条
pd.setMax(100);这是设置最大值
pd.setProgress(20);//这是默认值
3.显示内容
pd.setMessage("正在下载数据");
4.显示
pd.show();
进度条可以在子线程中去更新的,我们可以用子线程去更新这个进度条
单选框(RadioButton)
多选框(CheckBox)
下拉列表框<Spinner>内部实现跟listView原理是一样的
1.main定义这个控件<Spinner>
2.spinner组件找到
3.设置数据
spinner.setAdapter(adapter)
android.widget.spinnerAdapter的接口,继承是的adapter,
4.实现adapter的类newArrayAdapter<T>(context,resource,textViewResourceId,objects)
context:this,上下文
resource:这个是条目对应的资源文件,定义一个xml的布局文件
textViewResourceId:想绑定的控件id
objects:显示的条目数据
5.定义事件:
spinner.setOnItemSelectedListener(newOnItemSelectedListener()接口,里面有两个方法一个是onItemSelected(当条目被选择时的事件),onNothingSelected(当一个条目都没有被点击的事件)
这个组件一般很少用因为很难看,一般是定义一个ImageButtion,点击后在下面显示一个listView
自动补全文本的textView
AutocompleteTextView
1.定义提示数据:
String[]names={"老张","老方","老毕","李明","李丽","陈江","abc","acc"};
2.AutocompleteTextView控件寻找
AutoCompleteTextView nameText=(AutoCompleteTextView)this.findViewById(R.id.name);
3.创建适配器
ArrayAdapter<String>adapter=newArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,names);
R.layout.simple_dropdown_item_1line:是一个简单的布局
4.设置适配器
nameText.setAdapter(adapter);
5,main布局中还要设置默认的匹配大小,就是输入几个以后开始提示:
android:completionThreshold="1"//指定几个字开始提示,一般默认是2个字
多次输入内容自动完成文本框(就是说想要多次提示,在输入字符用","豆号分隔)
MultiAutocompleteTextView
ViewFlipper的控件使用:多个图层之间的相与切换
1.控件ViewFlipper定义
2.activity里找到ViewFlipper的控件
3.添加显示条目
vf.addView()
4.创建一些TextView加入到ViewFlipper中
5.经过第3步跟第4步就创建了一个图层,可以循环3跟4去创建更多的图层
6.显示条目
vf.showNext();//显示下一个
vf.showPrevious()//显示上一个
手势识别器:GestureDeteCtor类
1.新建GestureDetector类,在这个方法中有一个参数是android.view.GestureDetector.OnGestureListener是一个识别的监听器,我们new这个接口的时候发现有好多需要实现的方法,一般google工程师都给我们创建了一个简单的识别监听器类(GestureDetecotr.SimpleOnGestureListener())
2.接口中用onFling()方法,这个方法是手指在屏幕上滑动的时候调用的方法
onFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY)
e1:手指第一次接触屏幕的事件,e1.getX()得到x的坐标位置,e1.getY()得到y的坐标位置
e2:手指离开屏幕的事件
velocityX:水平移动速度(像素)
velocityY:垂直移动速度(像素)
android中坐标左上角是(0,0)
3.然后重写当前activity的onTouchEvent(MotionEventevent)事件,里面的实现代码:
mGesturcDetector.onTouchEvent(event);//使用手势识别器,,识别当前的手势
在main.xml布局文件中android:visibility="gone"有三个选择:
visible:可见
invisible:不可见但还占用着布局的位置
gone:不可见也不占用布局的位置
android下的动画:
在api的devGuide的Animation(动画条目中)看到有三种,DrawableAnimation就是桢动画
桢动画:
1.创建xml配置文件:
在android的资源文件res下创建一个anim的目录,在这个目录下新建一个xml文件,ResourceType:选择Drawable,下面的RootElement根据元素选择animation-list,然后在api中copy以下的xml配置信息
TheXMLfileconsistsofan<animation-list>elementastherootnodeandaseriesofchild<item>nodesthateachdefineaframe:adrawableresourcefortheframeandtheframeduration.Here'sanexampleXMLfileforaDrawableanimation:
<animation-listxmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<itemandroid:drawable="@drawable/rocket_thrust1"android:duration="200"/>
<itemandroid:drawable="@drawable/rocket_thrust2"android:duration="200"/>
<itemandroid:drawable="@drawable/rocket_thrust3"android:duration="200"/>
</animation-list>
2.创建动画的图片资源,在android的资源文件Res下新建一个drawable目录用于存放播放的图片资源文件
3.修改从api中copy过来的配置信息
<itemandroid:drawable="@drawable/rocket_thrust2"android:duration="200"/>
android:drawable=这里写资源文件,android:duration=这里填的是播放的时长
4.activity中实现播放的功能
ImageViewrocketImage;
rocketImage.setBackgroundResource(R.drawable.anim)//引入动画
AnimationDrawableanimationDrawable=(AnimationDrawable)rocketImage.getBackground();//获取AnimationDrawable对象
然后就可以在点击事件中调用animationDrawable.start()方法启动了
上面的播放只能播放一次,如果配置文件中配置android:oneshot="false"就可以播放多次,上面的播放animationDrawable.start()一定要写在点击事件中,如果直接跟在前面的代码后面是播放不出来的,因为这也是要准备的.上面的准备写在activity的onCreate方法中,所以一般我们不使用这个控件,可以自己开一个线程去实现这个控件的功能
view动画:
api-->devGuide-->Animation-->viewanimatin中定义了创建的步骤
透明度变化的动画:
1.在res资源文件夹下创建一个anim文件夹,然后建立一个xml配置文件在resourcetype中选择TweenAnimation在RootElement中选择alpha
2.在xml配置信息
android:fromAlpha="0.0"//这是完全透明
android:toAlpha="1.0"//这是完全不透明
android:duration="1000"//播放1秒钟
3.把资源文件的动画转化成一个对象
Animationa=AnimationUtils.loadAnimation(context.id);
context:上下文
R.anim.alpha:这是一个动画资源文件
4.播放动画
iv.startAnimation(a);
旋转的动画:
1.在res资源文件夹下创建一个anim文件夹,然后建立一个xml配置文件在resourcetype中选择TweenAnimation在RootElement中选择rotate
2.在xml配置信息
android:fromDegrees="0"//这是从零度开始
android:toDegrees="360"//这是旋转的度数
android:pivotX:旋转的X位置(旋转圆心)
android:pivotY:旋转的Y位置(旋转圆心)
adnroid:duration="2000"2秒转一圈
android:repeatCount="2"旋转的圈数
android:repeatMode="restart"正的开始如果是reverse这是倒的开始
3.把资源文件的动画转化成一个对象
Animationa=AnimationUtils.loadAnimation(context.id);
context:上下文
R.anim.alpha:这是一个动画资源文件
4.播放动画
iv.startAnimation(a);
缩放的动画
1.在res资源文件夹下创建一个anim文件夹,然后建立一个xml配置文件在resourcetype中选择TweenAnimation在RootElement中选择scale
2.在xml配置信息
android:fromXScale="0.5"从水平二分之一开始
android:toXScale="2.0"到水平二倍结束
android:fromYScale="0.5"从垂直二分之一开始
android:toYScale="2.0"到垂直二倍结束
android:duration="2000"指定时长
3.把资源文件的动画转化成一个对象
Animationa=AnimationUtils.loadAnimation(context.id);
context:上下文
R.anim.alpha:这是一个动画资源文件
4.播放动画
iv.startAnimation(a);
位移的动画效果
1.在res资源文件夹下创建一个anim文件夹,然后建立一个xml配置文件在resourcetype中选择TweenAnimation在RootElement中选择translate
2.在xml配置信息
android:fromXDelta="0"//从那个x坐标开始
android:toXDelta="50"//向右移动50个像素
android:fromXDelta="0"//从那个y坐标开始
android:toXDelta="100"//向下移动100个像素
android:duration="2000"//播放2秒钟
android:startOffset="2000"//延迟2秒播放
3.把资源文件的动画转化成一个对象
Animationa=AnimationUtils.loadAnimation(context.id);
context:上下文
R.anim.alpha:这是一个动画资源文件
4.播放动画
iv.startAnimation(a);
上面移动量也可以不写死,100%p写这个参数相当于移动父窗体大小的距离
指定一组动画集:
1.在res资源文件夹下创建一个anim文件夹,然后建立一个xml配置文件在resourcetype中选择TweenAnimation在RootElement中选择set,在里面可以包含以上几个动画的xml文件内容
代码的方式创建动画
(例如游戏的应用,如工具包,手机杀毒动态显示手机杀毒文件条目)
可以根据xml文件的配置,创建相应的类,实现配置文件一样的功能
9_patch图片(后缀名为9.png)
在android的tools的目录下有一个draw9patch.bat的文件,这个是专门处理9patch图片的,如果我们想让一个图片在拉伸的时候不畸形的话可以用这个工具在四个角上没有图形的空白界面上点上四个小黑点
android下屏幕适配
1,适配主流屏幕
ldpi小分辨率
mdpi中等
hdpi高
xhdpi超大(平板)
如果建立layout_480x320表示建立一个分辨是480x320的布局
这样手机会自动去匹配布局界面,默认是layout,没找到就用这个
尽量采用线性布局和相对布局,适配绝大数的屏幕,采用相对的像素单位dip,sp
也可以设置手机横竖的布局layout-land,在代码里面的单位都是像素的
android国际化
在android的系统源代码中还有很多国际化的设置,可以在资源文件的res包中看到下面有很多包,如values-zh-rCN,这是中国,还有一个要注意的就要一定要创建一个values的文件夹还要在这下面创建一个strings.xml文件,这个默认的,中国也可以用values-zh,这里的配置信息可以在html的语言里查看前面是国家后面r加语言
文字国际化,图片也能国际化
drawable-en-rUS这是存放给美国语言看的,但是也要有一个默认的drawable目录存放默认的图片
apk的安装器
调用系统的组件:在android系统源代码中找到apps文件夹-->PackageInstaller-->查看清单文件-->PackageInstallerActivity的activity下面找到他的intent配置-->根据配置创建一个安装意图,如果要发布到app市场的话就要用eclipse的导出apk,这里就可以指定我们的证书,如果直接用eclipse为我们生成的apk那个是debug的证书
android手机的传感器
方向传感器指南针
1.得到传感器服务
SensorMangersm=getSystemService(SENSOR_SERVICE);
2.注册传感器监听器
sm.registerListener(listener,sensor,rate);
listener:SenseEventListener设置监听的对象
sensor:注册到那个对象上
rate:监听的速率
上面第三个参数为采样率:最快、游戏、普通、用户界面。当应用程序请求特定的采样率时,其实只是对传感器子系统的一个建议,不保证特定的采样率可用。
最快:SensorManager.SENSOR_DELAY_FASTEST
最低延迟,一般不是特别敏感的处理不推荐使用,该种模式可能造成手机电力大量消耗,由于传递的为原始数据,算法不处理好将会影响游戏逻辑和UI的性能。
游戏:SensorManager.SENSOR_DELAY_GAME
游戏延迟,一般绝大多数的实时性较高的游戏都使用该级别。
普通:SensorManager.SENSOR_DELAY_NORMAL
标准延迟,对于一般的益智类或EASY级别的游戏可以使用,但过低的采样率可能对一些赛车类游戏有跳帧现象。
用户界面:SensorManager.SENSOR_DELAY_UI
一般对于屏幕方向自动旋转使用,相对节省电能和逻辑处理,一般游戏开发中我们不使用。
3.得到系统默认传感器,就可以得到传到上面的方法里了
Sensorsensor=sm.getDefaultSensor(Sensor.TYPE_ORIENTATION)//方向传感器
4.实现SensorEventListener接口实现里面的方法
onSensorChanged(SensorEventevent)//这是当传感器的数据发生变化的时候调用的方法,event就包含有当前信息的变化.放在一个数据中
float[]arr=event.values;//看提示里面根据数组的下标不同存放了不同的数据,具体看提示说明
现在我们只关心跟水平正方的偏移量就可以用arr[0]就行了0=North,90=East,180=South,270=West
在程序退出时要把传感关装,可以在activity的onDestroy()的方法中调用sm.unregisterListener(listener);把传感器关闭
5.定义一个图片,在onSersorChanged()方法中定义一个RotateAnimation的动画,如果传感器数据发生变化时我们旋转图片,偏移量即我们的偏移量
RotateAnimationra=newRotateAnimation(fromDegrees,toDegress,pivotXType,pivotXValue,pivotYType,pivotYValue);
fromDegrees:从那个角度开始
toDegress:正北偏移量,即我们得到的arr[0]的值
pivotXType:旋转的参考物,Animation.RELATIVE_TO_SELF参考自身
pivotXValue:这里指定0.5F,表示当前控件的中间
pivotYType:旋转的参考物,Animation.RELATIVE_TO_SELF参考自身
pivotYValue:这里指定0.5F,表示当前控件的中间
设置时长
ra.setDuration(200);
把图片加到这个动画效果
iv.startAnimation(ra);
6.在后面还要设置一下fromDegrees,因为第一次移动的位置是0,偏移是toDegress,移完一次后,图片位置发生了变化,如果第二次移他的位置0就不表示正北方向了,我们需要把图片移回-toDegress,这们就又是正北了,然后再移动我们的偏移量所以代码应该写成
fromDegrees=-toDegress;
传感器可以用Sensorsensor=sm.getDefaultSensor(Sensor.TYPE_XXX)得到某一传感器
关闭应用程序:
如果一个activity调用了finish()的方法就会把activity关闭并移动任务栈
1.创建一个类继承Application类,一个android的应用程序创建的时候,他首先会把自己的Application创建出来,所以会先执行我们创建的继承Application的类,创建这个类时会先调用onCreate()方法,这个方法是当应用的进程被创建的时候调用的方法
2.创建一个ArrayList<Activity>的集合,存放的是所以被打开的actiivty.
3.在要打开的activity的onCreate()方法中调用getApplication()方法得到Application,然后调用定义的集合,使用add(this)的方法把当前的activity对象加入到application的创建的集合中
4.在销毁一个activity的时候调用onDestroy(),在这个方法中调用如下代码,就可以把当前的activity从application的集合中移除:
MyAppmyapp=(MyApp)getApplication();
if(myApp.activies.contains(this)){
myApp.actives.remove(this);}
5.继承Application的对象需要在清单文件中去配置,才能加载成功
在AndroidManifest.xml清单文件中找到Application的结点,在name中添加应用程序的名称
6.然后在程序中定义一个关闭应用程序的按钮,接下来在代码中用循环去关闭application中存在的activity对象,调用finish()方法关闭activity对象
别的关闭程序的做法:
就是注册一个广播接受者,自定义的广播接受者,当播放发送一个close的路径时,每个接收到的activity就会调用finish()方法关闭当前activity
采用html开发andorid程序
可以让javascript跟android进行通讯,
1,在布局文件中定义一个WebView组件,展现网页的控件
2.找到WebView控件
3.webview.loadUrl(url);(这是代码最后一步)
4.添加一个访问网络权限
5.在网页超连接中有这么一段代码:
<aonClick="window,demo,callPhone()"href="">打电话</a>如果要用这段代码去实现打电话
6.获取webview的设置
WebSettingssetting=webview.getSettings();
7.允许javaScript执行代码
setting.setJavaScriptEnabled(true);
8.webview中增加javascript的接口
webview.addjavascriptInterface(obj,interfaceName);
obj:对象,我们就new一个对象newObject(){
//定义方法,就是javascript中定义的方法
publicvoidcallPhone()
{这里面实现拨打电话的动作}
}
interfaceName:接口名称就是上面javascript中定义的demo
apache也提供一个工具让javascript操作android手机,这样的好处在于如果客户端的页面更改了不需要用户去更新,只要在服务更新就可以了
java代码调用javascript代码,如调用javascript中的fillcontent()方法
1.webview.loadUrl(url);这里的url是javascript方法的地址"javascript:fillcontent()"这个执行必须先执行上面的(在onCreate是运行)
获取运营商信息
就是得到sim卡的信息,即是得到电话相关的系统服务
1.得到电话服务
TelephonyMangertm=(TelephonyManger)getSystemService(TELEPHONY_SERVICE);
2.可以用getNetworkType()获取网络类型,getNetworkOperator()获取运营商信息
3.getNetworkOperatorName()得到运营商的信息,这个是需要运营商支持的
第一种方法:
获取手机的IMSI码,并判断是中国移动\中国联通\中国电信
TelephonyManagertelManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
/**获取SIM卡的IMSI码
*SIM卡唯一标识:IMSI国际移动用户识别码(IMSI:InternationalMobileSubscriberIdentificationNumber)是区别移动用户的标志,
*储存在SIM卡中,可用于区别移动用户的有效信息。IMSI由MCC、MNC、MSIN组成,其中MCC为移动国家号码,由3位数字组成,
*唯一地识别移动客户所属的国家,我国为460;MNC为网络id,由2位数字组成,
*用于识别移动客户所归属的移动网络,中国移动为00,中国联通为01,中国电信为03;MSIN为移动客户识别码,采用等长11位数字构成。
*唯一地识别国内GSM移动通信网中移动客户。所以要区分是移动还是联通,只需取得SIM卡中的MNC字段即可
*/
Stringimsi=telManager.getSubscriberId();
if(imsi!=null){
if(imsi.startsWith("46000")||imsi.startsWith("46002")){//因为移动网络编号46000下的IMSI已经用完,所以虚拟了一个46002编号,134/159号段使用了此编号
//中国移动
}elseif(imsi.startsWith("46001")){
//中国联通
}elseif(imsi.startsWith("46003")){
//中国电信
}
}
第二种方法
TelephonyManagertelManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
Stringoperator=telManager.getSimOperator();
if(operator!=null){
if(operator.equals("46000")||operator.equals("46002")){
//中国移动
}elseif(operator.equals("46001")){
//中国联通
}elseif(operator.equals("46003")){
//中国电信
}
}
在手机data/data/com.android.providers.telephony/database下有一个mmssms.db(信息),telephony.db(手机)的数据库
反编译apk
1.apk文件可以重命名一下成rar文件,apk文件实际就是一个rar文件
2.解压缩文件
3.里面有一个dex的文件这个是java源代码编译成的class文件的打包生成的dex文件,可以用dex2jar-0.0.7.11-SNAPSHOT:的工具,把dex的文件copy在工具目录中,然后在dos下执行dex2jar.batdex文件名就可以得到一个jar文件
4.jd-gui.exe这个去查看刚才生成的jar文件的源代码
5.清单文件跟布局文件编译用apktool,用这个工具去查看apk里面的资源文件,这个apktool包含两个压缩包一个是apktool-install-windows-r04-brut1这个是为windows用户提供的工具,还有一个是apktool1.4.1这里面有一个apktool.jar,这个是真正的反编译的jar包,我们可以把apktool.jar这个jar包放在apktool-install-windows-r04-brut1的文件夹下,在把要反编译的apk文件也放在这个文件夹下,最后在do的命令行下执行apktooldsms.apk这个d的意思就是反编译,然后就可以看清单文件跟资源文件了
如果底层用c代码的话那么反编译的难度会增加很多就是用jni,