android笔记
- 格式:docx
- 大小:22.45 KB
- 文档页数:8
Android学习笔记_72_Spinner的⽤法⼀、普通1、<?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="/apk/res/android"android:id="@android:id/text1"android:layout_width="match_parent"android:layout_height="wrap_content"android:ellipsize="marquee"android:gravity="left"android:paddingLeft="8dip"android:singleLine="true"android:textSize="12sp"android:textStyle="bold"android:textColor="@color/gsdk_black"android:text="sdf"/>2private String[] method = null;ArrayAdapter<String> methodAdapter = new ArrayAdapter<String>(this,yout.simple_spinner_item, method); methodSpinner = (Spinner) findViewById(R.id.spinner_recharge_type);moneyAdapter.setDropDownViewResource(yout.select_dialog_item);methodSpinner.setAdapter(methodAdapter);⼆、⾃定义spinner:1、配置⽂件:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_spinner_id"android:layout_width="60dp"android:layout_height="80dp"android:visibility="gone"/><TextViewandroid:id="@+id/tv_spinner_name"style="?android:attr/spinnerDropDownItemStyle"android:layout_width="match_parent"android:layout_height="35dip"android:gravity="center_vertical"android:paddingLeft="10dp"android:textColor="#000"android:textSize="@dimen/font_body"/></LinearLayout>2、填充数据List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();for (Project project : linkedList) {Map<String, Object> map = new HashMap<String, Object>();map.put("name", project.getName());map.put("id", project.getId());data.add(map);}searchAdapter = new SimpleAdapter(PurchaseActivity.this, data,yout.purchase_search_spinner, new String[]{"id","name"},new int[]{_spinner_id,_spinner_name});searchSpinner.setAdapter(searchAdapter);3、点击事件:注意点击事件是OnItemSelectedListener⽽不是OnItemClickListener.private class SearchSpinnerItemListener implements OnItemSelectedListener{@Overridepublic void onItemSelected(AdapterView<?> parent, View view,int position, long id) {Spinner spinner = (Spinner) parent;Map<String, Object> projectMap = (Map<String, Object>) spinner.getItemAtPosition(position);int pid = Integer.valueOf(projectMap.get("id")+"");String pname = (String) projectMap.get("name");Log.i("Purchase","pid: "+pid+" pname: "+pname);}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}}。
01、什么是3G02、android系统简介03、android背景介绍04、android的framewor简介05、两种虚拟机的比较06、sdk的下载以及简介07、创建android模拟器08、ddms简介09、platform-tools的简介及常见adb指令10、android项目的目录结构11、android下apk安装的过程12、常见的adb指令介绍13、创建模拟器遇到的常见错误14、电话拨号器15、点击事件的四种写法16、短信发送器17、相对布局&单位介绍18、现形布局&布局的组合19、表格布局&绝对布局20、帧布局21、测试相关概念22、android下junit测试框架配置23、logcat简介24、保存文件到手机内存25、android下文件访问的权限26、保存文件到SD卡中27、分析setting源代码获取SD卡大小28、_sharePreference入门29、xml文件的序列化30、采用pull解析xml文件31、采用断电调试的方法观察pull解析的的流程32、android下创建一个sqllite数据库33、sql语句实现数据库的增删改查34、系统api实现数据库的增删改查&Sqlite3工具的使用35、数据库的事物36、listView入门37、采用layoutInflater打气筒创建一个view对象38、采用数据适配器ArryAdapter39、常用数据适配器simpleAdapter40、数据适配器总结41、内容提供者简介42、内容提供者的实现43、短信的备份44、插入一条记录到系统短信应用45、内容观察者46、获取系统的联系人信息47、保存联系人到系统通讯录48、读取联系人的一个小细节49、网络图片查看器50、anr产生的原理&如何避免51、android消息机制入门52、网络html查看器53、字符乱码问题的处理54、采用get方式提交数据到服务器55、采用post方式提交数据到服务器56、提交数据到服务器中文乱码问题的处理57、采用httpclient提交数据到服务器58、异步http框架简介&实现原理59、异步http框架提交数据到服务器60、上传文件到服务器61、smartimageview&常见开源代码62、多线程下载的原理63、多线程断点下载的原理64、多线程java代码移植到android65、多线程下载文本页面的更新66、显示意图激活另一个activity67、隐式意图激活另一个activity68、隐式意图的配置69、隐式意图和显示意图的使用场景70、在不同activity之间数据传递71、activity的声明周期72、activity的启动模式73、activity横竖屏切换的声明周期74、开启新的activity获取他的返回值75、请求码和结果码的作用76、利用广播实现ip拨号77、短信窃听器78、自定义广播时间&发送自定义广播&广播接受者优先级79、采用服务执行长期后台操作80、采用服务窃听电话&服务的声明周期81、android进程优先级&为什么使用服务82、绑定方式开启服务&调用服务的方法83、服务的声明周期(混合开启84、采用aidl绑定远程服务85、代码注册广播接受者&利用广播调用服务的办法86、加载大图片到内存87、获取图片exif信息88、从gallery获取图片89、图片画画板90、扒开美女衣服91、图片的缩放92、图片的旋转93、图片的平移&镜面&倒影效果94、图片的合成95、图片的颜色处理96、多媒体播放api简介97、人脸识别98、mediaplayer的生命周期99、soundpoo简介100、sufaceview的生命周期101、播放在线视频102、视频播放器进度的处理103、调用系统照相机拍照和录像104、采用camera拍照105、常见对话框106、notification入门107、菜单108、android下的样式109、android下的主题110、代码编写ui111、html创建ui112、帧动画113、代码创建创建的tween动画114、xml文件定义动画115、传感器简介116、117、杀死进程118、apk的安装119、应用程序的反编译120、动态创建fragment121、用fragment创建一个选项卡122、fragment的向下兼容性123、fragment的生命周期124、fragment之间的通讯125、应用程序国际化04、android的framewor简介Wap:wait and playWireless Makeup Language(WML)精简的html语言Applications:android自带的基本上层应用Aplication framework:应用程序框架Librarics:Linux lernel:05、两种虚拟机的比较编译后文件格式:jvm:.java->.class->.jardalvik vm:.java->.dex->.odex基于的架构:jvm:基于栈的架构dalvik vm:基于寄存器的架构Cpu直接访问寄存器因此dalvik虚拟机的效率比jvm高06、sdk的下载以及简介->获取sdk工具包(sdk:standard develope kits)->ADT(android develop tools,实际上是eclipse的插件)SDK具体内容Android->SDK Plateform:开发时使用到的jar包->Samples for sdk:->ARM EABI V7a System Image:模拟器运行时的镜像->Intel n86 Aton System:模拟器运行时的镜像->MIPS System Image:模拟器运行时的镜像->google APIs:google提供的jar包,可以直接使用google提供的一些API ->source for android SDK:SDK全部的源代码Extrals:->tools:开发的工具->support library:实现高版本的android向下的兼容->google Admed Ads SDK:gongle提供的广告插件->Analyties App Irackiong SDK:应用的用户分析->cloud message:云消息->gongle play service:收费服务->google USB Driver:真实的设备驱动开发时:基于4.0,兼容2.2、2.3.307、创建android模拟器avd:android virture developerVGA:480*640(电视的标准分辨率)QVGA:240*320(四分之一)HVGA:320*480(一半)WVGA:480*800(width)FWVGA:480*854(更宽)08、ddms简介ddms:模拟器不支持中文,因此发送中文会显示不出来09、platform-tools的简介及常见adb指令Android调试桥:内部实现就是socket让两个系统之间实现数据交互->reset adb:模拟器找不到时候可以重启->adb device:列出所有的连接的设备->adb kill-server:杀死adb调试桥->adb start-server 启动adb调试桥dx.bat:将.class文件打包10、android项目的目录结构一:SDK的目录结构->Samples->Api demo:根据API demo(模拟器上面可以看见)的效果可以在sample中看见相应的代码->Source:jar包所有的sdk源代码都在这个文件夹里->SystemImage:系统镜像->temp:下载更新临时存储的文件夹,一般是空的->tools:emulater.ext 不同版本的模拟器二:New Android Application->theme:留给以后作为扩展,现在并没有太大的作用->target SDK:一般选择高版本,因为高版本对下兼容->mark project as a library:一般不选择,意思是将这个项目提供一个jar包供别人使用三:文件夹目录.setting:设置目录assets:资产目录,存放一些文件,这些文件会被原封不动打包到应用程序的apk中bin:gen:自动生成的目录->builderConfig.java:生成的配置信息->R.java:Android 4.1.2->android.jar开发环境,jar包可以在properties中修改,jar包就是SDK011、Android下apk的安装过程一、Android安装过程分析:->setContentView:甚至view的对象,把里面的xml文件加载到->在project中选择build automaticly会自动把文件生成字节码文件,.class $代表的class文件生成的是内部类->dex.bat文件会把.class文件生成.dex文件->apk压缩文件解压内部内容->META-INF:应用程序的签名eclipse的调试签名文件->res:资源文件->classes.dex:class文件->resources.arsc:资源ID映射->android软件安装的过程:->拷贝xxx.apk带/data/app/xxx-1.apk->在/data/data目录下创建一个文件夹,文件夹名称当前应用程序的报名012、常见adb指令前提:->设备连接上电脑而且驱动安装正常,如果安装不正常的话,会有黄色的问号显示;->设备上打开USB调试;指令:->adb device(如果启动发现这个程序没有安装会自动安装)->adb kill-server->adb start-server->adb uninstall <包名>->adb -s emulator-5554 install c:\\users\\administrator\\hello.apk如果有多个设备的话,如果不指定安装的是哪个设备程序会报错->adb push haha.prop /sdcard/haha.txt 将文件移到(360管家,豌豆荚之类的软件他们也是用的adb指令,倘若电脑上装这些软件的话,会因为两个adb指令抢端口号而挂掉)(adb版本之间兼容不是很好,经常报错可以考虑下版本的问题)->adb shell:远程连接到了android的linux终端ls:显示文件夹ps:显示正在运行的程序ping:网络连通性013、创建模拟器遇到的常见错误->路径最好不要有中文:->应用安装不上,或者安装模拟器的时候开启一个新的模拟器:可能是模拟器的资源被占用,模拟器在运行的时候其实占用着硬盘上面的一个文件,这个文件位于工作空间.android/avd/iphone.avd 里面会有镜像文件,当一个模拟器开启起来了,就给你创建一个文件夹.knock的文件夹,代表着这个模拟器被锁定了,如果把模拟器关掉,就没有程序占据这几个镜像资源了,那么这几个程序就会被自动删除。
Android.bp学习笔记1.Android.bp简介Android 7.0之后希望⽤Android.bp替换Android.mk,bp简单的配置更⽅便Ninja ⽂件的产⽣,⽽Blueprint和Soong 就此产⽣。
Android 利⽤Blueprint和Soong 来解析bp⽂件,经过最终转换为ninja files。
Blueprint和Soong都是由Golang写的项⽬。
从Android Nougat开始,prebuilts/go/ ⽬录下新增了Golang所需的运⾏环境,在编译时使⽤。
Android.bp以及相关⽀持,从Android Nougat开始加⼊,从Android Oreo(8.0)开始默认开启。
如果需要在Android Nougat的版本使⽤,需要在执⾏编译时添加变量: make 'USE_SOONG=true' Soong是以前Android基于make的编译系统的替代品。
它以Android.bp⽂件替代Android.mk,Android.bp⽂件⽤类似JSON的简洁声明来描述需要构建的模块。
2.例⼦1cc_binary { //编译成可执⾏⽂件,cc_library_shared编译成动态库name: "bt_test", //编译出的可执⾏⽂件的名字为bt_testvendor: true, //编译出来放在/vendor⽬录下(默认是放在/system⽬录下)srcs: ["bt_test.cpp"], //源⽂件,格式["a.cpp", "b.cpp"]cflags: ["-Wall","-Werror","-Wno-unused-parameter",], //编译flaginclude_dirs: ["hardware/interfaces/halnode/1.0/default", //⽤户值定的头⽂件查找路径],shared_libs: [ //编译依赖的动态库"liblog","libutils","libhidltransport","android.hardware.halnode@1.0","libhidlbase","libbase",],}2.其它可⽤选项subdirs = ["ndk"] //指定进⼊下层ndk⽬录进⾏编译export_include_dirs: [ //从其他模块添加头⽂件检索路径 "include", "include/camera" ],export_shared_lib_headers: ["libcamera_metadata"],local_include_dirs: ["aidl"], //如果从当前⽬录添加路径时使⽤,将./aidl⽬录加⼊头⽂件的搜索路径static_libs: ["libupdater"], //指定对库libupdater进⾏静态链接 static_executable: true,4.官⽅最全解释5.变量Android.bp⽂件可包含顶级变量赋值:test_srcs = ["src/test.c"],cc_binary {name: "test",srcs: test_srcs,}变量范围限定为声明它们的⽂件的其余部分,以及任何⼦蓝图⽂件。
Android(java)学习笔记47:通过反射获得构造⽅法并且使⽤1. 获取字节码⽂件对象:Class c = Class.forName("cn.itcast_01.Person");2. 获取构造⽅法public Constructor[] getConstructors():所有公共(public)构造⽅法public Constructor[] getDeclaredConstructors():所有构造⽅法⽐如使⽤:Constructor[] cons = c.getDeclaredConstructors();//获取所有构造⽅法下⾯我会通过代码形式进⾏讲解:Person.java:1package cn.itcast_01;23public class Person {4private String name;5int age;6public String address;78public Person() {9 }1011private Person(String name) { = name;13 }1415 Person(String name, int age) { = name;17this.age = age;18 }1920public Person(String name, int age, String address) { = name;22this.age = age;23this.address = address;24 }2526public void show() {27 System.out.println("show");28 }2930public void method(String s) {31 System.out.println("method " + s);32 }3334public String getString(String s, int i) {35return s + "---" + i;36 }3738private void function() {39 System.out.println("function");40 }4142 @Override43public String toString() {44return "Person [name=" + name + ", age=" + age + ", address=" + address45 + "]";46 }4748 }ReflectDemo.java:1package cn.itcast_02;23import ng.reflect.Constructor;45import cn.itcast_01.Person;67/*8 * 通过反射获取构造⽅法并使⽤。
基于Android的快捷记事本的设计与实现快捷记事本是一款方便用户随时随地记录信息的应用程序。
基于Android平台的快捷记事本的设计与实现,可以提供给用户一个简单而高效的记事工具。
一、设计思路:快捷记事本需要具备以下功能:1. 用户可以通过界面简单快捷地添加新的笔记。
2. 用户可以对已有笔记进行编辑、删除和查看操作。
3. 笔记可以按照创建时间进行排序,新建的笔记在前。
4. 用户可以通过关键字搜索笔记内容。
5. 用户可以设定提醒时间或者提醒周期。
二、界面设计:1. 主界面:主界面显示用户已创建的所有笔记,按照创建时间排序。
每个笔记显示标题、内容和创建时间。
界面上方有一个“+”按钮,点击即可进入添加笔记界面。
2. 添加笔记界面:添加笔记界面包括标题和内容的输入框,用户输入后点击“保存”按钮即可保存笔记并返回主界面。
3. 编辑笔记界面:编辑笔记界面显示已选中的笔记的标题和内容,用户可以在输入框进行编辑。
点击“保存”按钮即可保存笔记并返回主界面。
4. 查看笔记界面:点击主界面的某个笔记后,即可进入查看笔记界面,显示该笔记的标题和内容。
界面下方有“编辑”和“删除”按钮,用户可以对该笔记进行相应操作。
三、关键技术实现:1. 使用RecyclerView实现主界面的笔记列表展示。
RecyclerView是一种高效的列表控件,可以对列表项进行复用,提高性能。
2. 使用SQLite数据库存储笔记数据。
SQLite是一种轻量级的数据库,适用于移动设备。
每个笔记包含标题、内容和创建时间等字段,可以通过数据库操作实现增删改查功能。
3. 使用SearchView实现搜索功能。
SearchView是Android提供的搜索控件,可以根据用户输入的关键字进行搜索,并展示搜索结果。
4. 使用AlarmManager实现提醒功能。
AlarmManager是Android提供的定时任务管理器,可以设置提醒时间,到达指定时间后触发相应事件。
Android开发⾃学笔记(AndroidStudio)—4.1布局组件⼀、引⾔Android的界⾯是有布局和组件协同完成的,布局好⽐是建筑⾥的框架,⽽组件则相当于建筑⾥的砖⽡。
组件按照布局的要求依次排列,就组成了⽤户所看见的界⾯。
在Android4.0之前,我们通常说Android开发五⼤布局和四⼤组件,这五⼤布局就是:1. LinearLayout 线性布局2. FrameLayout 单帧布局,也有中⽂翻译为帧布局、框架布局。
3. RelativeLayout 相对布局4. AbsoluteLayout 绝对布局5. TableLayout 表格布局⽽在Android4.0之后⼜新增了⼀种GridLayout⽹格布局。
⼆、LinearLayout线性布局线性布局是Android开发中最常见的⼀种布局⽅式,它是按照垂直或者⽔平⽅向来布局,通过“android:orientation”属性可以设置线性布局的⽅向。
属性值有垂直(vertical)和⽔平(horizontal)两种。
线性布局的排列在某⾏或者某列并不会⾃动换⾏或换列,就是说如果采⽤⽔平布局,控件宽度超过屏幕显⽰的话,后⾯的控件都将被隐藏,不会⾃动换⾏。
常⽤的属性有:1. android:orientation:可以设置布局的⽅向2. android:id - 为控件指定相应的ID3. android:text - 指定控件当中显⽰的⽂字,需要注意的是,这⾥尽量使⽤string.xml4. android:gravity - 指定控件的基本位置,⽐如说居中,居右等位置5. android:textSize - 指定控件当中字体的⼤⼩6. android:background - 指定控件所⽤的背景⾊,RGB命名法7. android:layout_width - 指定控件的宽度8. android:layout_height - 指定控件的⾼度9. android:layout_weight - 指定控件的占⽤⽐例10. android:padding - 指定控件的内边距,也就是说控件当中的内容11. android:sigleLine - 如果设置为真的话,则将控件的内容显⽰在⼀⾏当中layout_weight属性以控制各个控件在布局中的相对⼤⼩。
android移动应用开发技术课第一章笔记第一章:Android移动应用开发技术课笔记一、引言在当今移动互联网时代,Android系统以其开放性和普及率成为了最受欢迎的移动操作系统之一。
随着移动应用市场的不断扩大,对Android移动应用开发技术的需求也日益增加。
学习和掌握Android移动应用开发技术成为了越来越多人的选择。
二、Android移动应用开发技术概述1. 什么是Android?Android是一款基于Linux操作系统的开源移动设备操作系统,主要用于触摸屏移动设备,如智能手机和平板电脑。
Android操作系统的开放性使得开发者可以自由定制和开发应用,受到了广大用户的喜爱。
2. Android移动应用开发技术的重要性随着信息化和数字化的发展,移动应用成为了人们获取信息和进行交流的重要方式。
而Android作为最主流的移动操作系统之一,其应用的开发和推广具有巨大的市场潜力和商业价值。
掌握Android移动应用开发技术成为了许多开发者和从业者的追求目标。
三、学习Android移动应用开发技术的重要性1. 对于个人的意义学习Android移动应用开发技术可以提升个人的职业技能,并且在移动应用开发领域有更多的发展机会。
可以通过开发自己的应用来实现个人价值和创造财富。
2. 对于企业的意义随着移动互联网的发展,各类企业都希望拥有自己的移动应用,以提升品牌形象和服务用户。
懂得Android移动应用开发技术的人才对企业来说显得格外宝贵。
四、学习Android移动应用开发技术的途径1. 自学通过阅读相关书籍、网上教程和参加线上培训班,可以自学Android 移动应用开发技术。
这种方式需要具备较好的自学能力和毅力。
2. 参加培训班选择权威的培训机构进行系统的学习和培训,可以更快速、系统地学习Android移动应用开发技术。
五、Android移动应用开发技术的未来发展随着人工智能、物联网、区块链等技术的不断发展,Android移动应用开发技术也将不断拓展应用场景和技术深度。
Android开发笔记之《远程控制(MQTTmosquitto)(ProtocalBuff。
Android推送⽅案分析(MQTT/XMPP/GCM): /lib/view/open1410848945601.htmlMQTT官⽹: /: /caca/p/mqtt.htmlOSChina grpc document : /grpc?t=56831⾼⼿对MQTT的理解: /leeying/p/3791077.htm⾼⼿对MQTT的经验之谈: /yongboy/archive/2015/01/11/422172.htmlMQTT是IBM开发的⼀个即时通讯协议。
MQTT是⾯向M2M和物联⽹的连接协议,采⽤轻量级发布和订阅消息传输机制。
Mosquitto是⼀款实现了 MQTT v3.1协议的开源消息代理软件,提供轻量级的,⽀持发布/订阅的的消息推送模式,使设备对设备若初次接触MQTT协议,可先理解以下概念:【MQTT协议特点】——相⽐于RESTful架构的物联⽹系统,MQTT协议借助消息推送功能,可以更好地实现远程控制。
【MQTT协议⾓⾊】——在RESTful架构的物联⽹系统,包含两个⾓⾊客户端和服务器端,⽽在MQTT协议中包括发布者,代理器(服务器)和订阅者。
【MQTT协议消息】——MQTT中的消息可理解为发布者和订阅者交换的内容(负载),这些消息包含具体的内容,可以被订阅者使⽤。
【MQTT协议主题】——MQTT中的主题可理解为相同类型或相似类型的消息集合默认会监听⼀下端⼝:1883: MQTT, 不加密8883: MQTT, 加密8884: MQTT, 加密, 客服端需要验证8080: MQTT 通过WebSockets, 不加密mosquitto ubuntu下编译和安装: /skykingf/article/details/46459857先到官⽹ /download/咱们下载最新的包:/files/source/mosquitto-1.4.8.tar.gz切换到~,执⾏ wget /files/source/mosquitto-1.4.8.tar.gz然后 chmod 777 mosquitto-1.4.8.tar.gz然后 tar -zxf mosquitto-1.4.8.tar.gzcd mosquitto-1.4.8然后执⾏ make可能会找不到 uuid头⽂件,sudo apt-get install uuid-dev然后进⾏makesudo make install安装完毕后在~⽬录下输⼊:mos 然后tab键按2下出现:mosquitto mosquitto_passwd mosquitto_pub mosquitto_sub备注:在执⾏ mosquit的时候可能会出现找不到 so:sudo cp /usr/local/lib/libmosquitto.so.1开启MQTT:$ mosquitto start停⽌MQTT:$ mosquitto stop查看MQTT状态:$ mosquitto status查看监听的端⼝:$ netstat -anplt | grep 1883测试下,$ mosquitto_sub -h -t "#" -vmosquitto测试测试:⼀、开起第⼀个终端窗⼝,直接运⾏mosquitto即可:⼆、开启另⼀个终端窗⼝,运⾏订阅程序mosquitto_sub:注意:消息推送的发布和订阅要有主题,选项[-t] 主题,即:mosquitto -t 主题如需指定⽤户名称则加选项[-i] ⽤户名,即:mosquitto_sub -t 主题1 -i 订阅端三、开启第三个终端窗⼝,运⾏发布端程序mosquitto_pub:指定消息推送的主题,发布端⽤户名和消息:mosquitto_pub -t 主题1 -i 发布端 -m 你好*注意:如果消息中间有空格则消息要已单引号括起来。
Android应用程序组件中有一个生命周期,贯穿于创建到结束的整个周期。
周期里面含有各种状态,这些状态对组件的生命周期起着至关重要的影响。
一、Activity生命周期1.Activity有三个状态(1)活动(active)或称运行(running):屏幕前台的Activity (当前任务中栈顶的Activity),用来处理当前用户的请求。
(2)暂停(paused):指当前运行的Activity在屏幕上失去焦点但却对用户是可见的,也就是说用户能看得到它的界面,不过他是被当前Activity挡住了。
暂停状态下的Activity仍是存活的(维持着所有状态和成员信息,屏幕上还会有它的窗体)。
当前系统资源处于极度缺乏的情况下,这个状态下的Activity就会被干掉。
(3)停止(stopped):屏幕不再有它的窗体,但是它仍然保留着所有状态和成员信息。
通常当系统其它地方需要更多的内存时,这个Activity就会被干掉。
2.如果一个Activity处于暂停或停止状态时,系统要么从内存中清除它要么调用它的finish()销毁它或是简单地干掉它的进程。
当用户再次调用了这个Activity,它就会重新开始并保存住先前的状态。
3.Activity的生命周期的转变本质上是其内部状态间的转变,Android提供了如下几个protect方法:Java代码1.void onCreate(Bundle savedInstanceState)2.void onStart()3.void onRestart()4.void onResume()5.void onPause()6.void onStop()7.void onDestroy()4.以上方法均属钩子方法,我们需要重写它们,以使状态改变时做出恰当的行为。
所有的Activity必须要重写onCreate(),因为这个方法用来做初始化和组装Activity的工作。
大多数情况下,最好也要重写onPause()方法,主要是针对用户发出停止请求的情况下,我们需要在这个方法里面做一些处理(这一点很重要,下面会有所解释)。
Android学习笔记_SIM卡介绍一、判断SIM卡属于哪个移动运营商1、第一种方法:获取手机的IMSI码,并判断是中国移动\中国联通\中国电信TelephonyManager telManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);/**获取SIM卡的IMSI码* SIM卡唯一标识:IMSI 国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志,* 储存在SIM卡中,可用于区别移动用户的有效信息。
IMSI由MCC、MNC、MSIN 组成,其中MCC为移动国家号码,由3位数字组成,* 唯一地识别移动客户所属的国家,我国为460;MNC为网络id,由2位数字组成,* 用于识别移动客户所归属的移动网络,中国移动为00,中国联通为01,中国电信为03;MSIN为移动客户识别码,采用等长11位数字构成。
* 唯一地识别国内GSM移动通信网中移动客户。
所以要区分是移动还是联通,只需取得SIM卡中的MNC字段即可*/String imsi = telManager.getSubscriberId();if(imsi!=null){if(imsi.startsWith("46000") || imsi.startsWith("46002")){//因为移动网络编号46000下的IMSI已经用完,所以虚拟了一个46002编号,134/159号段使用了此编号//中国移动}else if(imsi.startsWith("46001")){//中国联通}else if(imsi.startsWith("46003")){//中国电信}}2、第二种方法:TelephonyManager telManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);String operator = telManager.getSimOperator();if(operator!=null){if(operator.equals("46000") || operator.equals("46002")){//中国移动}else if(operator.equals("46001")){//中国联通}else if(operator.equals("46003")){//中国电信}}二、从SIM卡中获取联系人信息1、可以通过内容提供者进行访问,下面是主要代码。
初次接触到android的clip有以下两点疑问:1.Clip(剪切)的时机2.Clip中的Op的参数的意思。
通常咱们理解的clip(剪切),是对已经存在的图形进行clip的。
但是,在android上是对canvas (画布)上进行clip的,要在画图之前对canvas进行clip,如果画图之后再对canvas进行clip不会影响到已经画好的图形。
一定要记住clip是针对canvas而非图形。
接下来通过android自带的APIdemo Clipping例子详细讲述Clip中的Op的参数的意思。
Android提供clipRect、clipPath和clipRegion剪切区域的API。
Op一共有DIFFERENCE,INTERSECT,UNION,XOR, REVERSE_DIFFERENCE, REPLACE六种选择。
例子:1.在canvas上剪切从(0,0)到(60,60)的方块。
下图蓝色区域加紫色区域。
2.在canvas上剪切从(40,40)到(100,100)的方块。
下图橄榄色区域加紫色区域。
3.在canvas上剪切从(0,0)到(100,100)的方块。
先在第二方块上加上Op参数例如:canvas.clipRect(40, 40, 100, 100, Region.Op. DIFFERENCE); 首先,需要搞清楚Op参数针对的对象。
接着了解其含义。
Op参数针对的对象是之前剪切的区域以及当前要剪切的区域。
在本例中涉及到区域是从(0,0)到(60,60)的方块和从(40,40)到(100,100)的方块。
那有哪些含义呢?就是表示当前要剪切的区域与之前剪切过的之间的关系。
DIFFERENCE:之前剪切过除去当前要剪切的区域(蓝色区域)。
INTERSECT:当前要剪切的区域在之前剪切过内部的部分(紫色区域)。
UNION:当前要剪切的区域加上之前剪切过内部的部分(蓝色区域+紫色区域+橄榄色区域)。
第四章管理Android系统桌面第一节管理壁纸初识Android壁纸在Android中,壁纸分为静态与动态两种。
静态壁纸是一张图片,而动态壁纸则以动画为表现形式,或者可以对用户的操作作出反应。
这两种形式看似差异很大,其实二者的本质是统一的。
它们都以一个Service的形式运行在系统后台,并在一个类型为TYPE_WALLPAPER 的窗口上绘制内容。
➢Android壁纸的实现与管理分为三个层次:⏹WallpaperService与Engine。
同SystemUI一样,壁纸运行在一个Android服务之中,这个服务的名字叫做WallpaperService。
当用户选择了一个壁纸之后,此壁纸所对应的WallpaperService便会启动并开始进行壁纸的绘制工作,因此继承并定制WallpaperService是开发者进行壁纸开发的第一步。
Engine是WallpaperService中的一个内部类,实现了壁纸窗口的创建以及Surface的维护工作。
另外,Engine提供了可供子类重写的一系列回调,用于通知壁纸开发者关于壁纸的生命周期、Surface状态的变化以及对用户的输入事件进行响应。
可以说,Engine类是壁纸实现的核心所在。
壁纸开发者需要继承Engine类,并重写其提供的回调以完成壁纸的开发。
这一层次的内容主要体现了壁纸的实现原理。
⏹WallpaperManagerService,这个系统服务用于管理壁纸的运行与切换,并通过WallpaperManager类向外界提供操作壁纸的接口。
当通过WallpaperManagaer的接口进行壁纸的切换时,WallpaperManagerService会取消当前壁纸的WallpaperService的绑定,并启动新壁纸的WallpaperService。
另外,Engine类进行窗口创建时所使用的窗口令牌也是由WallpaperManagerService提供的。
Android开发笔记TableLayout常⽤的属性介绍TableLayout经常⽤到的属性有:
android:collapseColumns:以第0⾏为序,隐藏指定的列:
android:collapseColumns该属性为空时,效果如下图:
把android:collapseColumns=0,2--------------》意思是把第0和第2列去掉,如下图:
android:shrinkColumns:以第0⾏为序,⾃动延伸指定的列填充可⽤部分:
当LayoutRow⾥⾯的控件还没有布满布局时,shrinkColumns不起作⽤,如下图:
设置了shrinkColumns=0,1,2,布局完全没有改变,因为LayoutRow⾥⾯还剩⾜够的空间。
当LayoutRow布满控件时,如下图:
设置设置了shrinkColumns=2,则结果如下图,控件⾃动向垂直⽅向填充空间:
android:stretchColumns:以第0⾏为序,尽量把指定的列填充空⽩部分:
设置stretchColumns=1,则结果如下图,第1列被尽量填充(Button02与TextView02同时向右填充,直到TextView03被压挤到最后边)。
Android JNI/NDK 学习笔记likunarmstrong@JNI,全称Java Native Interface,是用于让运行在JVM中的Java代码和运行在JVM外的Native代码(主要是C或者C++)沟通的桥梁。
代码编写者即可以使用JNI从Java的程序中调用Native代码,又可以从Native程序中调用Java代码。
这样,编程人员可以将低阶的代码逻辑包装到高阶的程序框架中,获得高性能高效率的同时保证了代码框架的高抽象性。
在Android中,仅有以下类库是允许在JNI中使用的:●libc (C library) headers●libm (math library) headers●JNI interface headers●libz (Zlib compression) headers●liblog (Android logging) header●OpenGL ES 1.1 (3D graphics library) headers (since 1.6)● A Minimal set of headers for C++ supportJNI本身仅仅是一个把两者融合的工具,作为编程者需要做的,就是在Java代码和Native代码中按照固定的格式告诉JNI如何调用对方。
在Android中,有两种方式可以调用JNI,一种是Google release的专门针对Android Native开发的工具包,叫做NDK。
去Android网站上下载该工具包后,就可以通过阅读里面的文档来setup一个新的包含Native代码的工程,创建自己的Android.mk文件,编译等等;另一种是完整的源码编译环境,也就是通过git从官方网站获取完全的Android源代码平台。
这个平台中提供有基于make的编译系统。
更多细节请参考这里。
不管选择以上两种方法的哪一个,都必须编写自己的Android.mk文件,有关该文件的编写请参考相关文档。
一、Android学习第一天——环境搭建Android 开发环境的搭建环境搭建需要①Android SDK ②JDK ③eclipse环境搭建开始:㈠将Android SDK与JDK解压,最好路径中不要出现汉字,然后配置环境变量,方便命令行操作㈡为eclipse(3.4.1)安装开发Android插件——Android ADTHelp-->Install New Software输入:https:///android/eclipse便会自动检测出所需要安装的东西,点击install即可。
㈢重启eclipse,进行Android SDK的配置。
Windows-->Preferences-->Android找到你解压的Android SDK的路径即可。
㈣新建一个Android Project来验证平台是否搭建成功。
注:我上面步骤走下来之后发现我在运行程序时,没有Android Virtual Devices(AVD)的选项。
这时可以在Windows-->Android SDK Manager中找到你所需要安装版本,进行安装。
搭建过程还是比较顺利,加油~二、Android学习第二天——初识Activity昨天程序搭建成功以后,就可以开发跟运行Android应用程序了,因为Activity是开发中不可或缺的组成部分,所以要对Activity有所认识。
以下两点是需要注意的:(个人总结)1.凡是覆写得方法,在方法体中的第一行一定是super.XXX(),一定要先调用父类里的相应方法做必要的事情,再根据自己的需求去写其他的代码。
2.如果是从头学习安卓开发,不一定要开发最新的版本,可以在较低版本(2.3.3)下进行开发,然后在高版本(4.0)下进行编译与运行,这样可以提高代码的适应能力,可以兼容高级版本。
下面对我今天的学习进行个小结:首先Android的四个重要部分①Activity——形象点就是一个应用程序的门面,我们在手机上看到的图形界面②Intent——它就像一个搬用工,用于Activity之间传递数据,就像请求③Service——这个是不可见的,是为整个应用程序提供服务支持的底层④Content Provider——为应用程序提供数据的接口上面的描述我自己感觉也比较抽象,今天专门研究了Activity,终于守得云开见月明:首先进行以下学习之前需要对Android的工程项目目录有一个总体的了解:自己总结:src下是我们自己写得程序;gen下是我们创建程序时系统自动生成的,切忌勿修改assets是一个资源库,与res的区别是不会自动在R.java中自动生成idres是一个资源库,与assets不同的是,每增加一个资源(图片等),会自动在R.java 中生成对应的idlayout用于存放布局文件,用来控制Activity的显示格局string.xml中存放的一个一个键值对,Activity可以对其进行提取AndroidManifest.xml是系统比较重要的一个文件,存放Activity的注册信息,每生成一个Activity就应该在这里注册一个。
android各个知识点总结一、Android基础知识点1. Android系统架构Android系统采用了一种分层的架构,分为四个主要的层次:Linux内核层、系统运行库层、应用框架层和应用层。
在Android应用开发中,了解Android系统的架构是非常重要的,可以帮助我们更好地理解Android的工作原理。
2. Android应用的生命周期Android应用的生命周期包括启动、运行、暂停、停止和销毁等几个阶段。
了解Android 应用的生命周期对于设计和开发Android应用是非常重要的,可以帮助我们更好地管理应用的状态和行为。
3. Android应用的组件Android应用的组件包括活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供者(Content Provider)。
在Android应用的开发中,了解每种组件的特点和用法是非常重要的,可以帮助我们更好地构建Android应用。
4. Android界面设计Android应用的界面设计是非常重要的,一个好的界面设计可以提高用户体验。
在Android应用的界面设计中,我们可以使用布局文件、控件和样式等技术来实现。
了解Android的界面设计技术可以帮助我们设计出更加美观、易用的界面。
5. Android存储Android应用可以使用多种方式进行数据的存储,包括文件存储、SharedPreferences、SQLite数据库等。
了解Android的存储技术可以帮助我们更好地管理应用的数据。
6. Android网络编程Android应用可以通过网络来获取数据或与服务器进行通讯,Android提供了多种网络编程的方式,包括HttpURLConnection、Volley、OkHttp等。
了解Android的网络编程技术可以帮助我们更好地实现应用与服务器的通讯。
7. Android多线程在Android应用的开发中,多线程是非常常见的,它可以提高应用的性能和用户体验。
Android四大基本组件分别是:1、活动(Activity);2、服务(Service);3、内容提供者(Content Provider);4、广播接收器(BroadcastReceiver)。
Activity答:应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。
一般所指的活动是用户界面。
一个应用程序可能有一个或者以上的活动存在,每个活动也都会有自己的View。
Service答:一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。
服务是在背景长时间运行的应用组件,不和用户直接进行互动。
BroadcastReceiver答:广播接收器Android四大组件的详细讲解Android应用程序由一些零散的有联系的组件组;Activities(活动)应用程序的显示层;Services(服务)Android应用程序中;Content(内容)提供共享的数据存储;Intents(意图)简单的消息传递框架;BroadcastReceivers(广播接收器;Notifications(通知)用户通知的框架;一、Activity详解ActAndroid应用程序由一些零散的有联系的组件组成,通过一个工程manifest 绑定在一起。
在manifest中,描述了每一个组件以及组件的作用,其中有6个组件,它们是Android应用程序的基石:Activities(活动)应用程序的显示层。
每一个画面对应于你的应用程序,将会是Activity类的扩展。
Activity使用Views去构建UI来显示信息和响应用户的行为。
就桌面开发而言,一个Activity相当于一张Form。
你在这章中将会学习到更多关于Activities。
Services(服务):Android应用程序中不可见的“工人”。
Service组件运行时不可见,但它负责更新的数据源和可见的Activity,以及触发通知。
它们常用来执行一些需要持续运行的处理,当你的Activity已经不处于激活状态或不可见。
你将在第8章学习怎样创建Service。
Content(内容):提供共享的数据存储。
Content Provider(内容提供器)用来管理和共享应用程序的数据库。
在应用程序间,Content Provider是共享数据的首选方式。
这意味着,你可以配置自己的Content Provider去存取其他的应用程序或者通过其他应用程序暴露的Content Provider去存取它们的数据。
Android设备本身包含了几个Content Provider来访问像联系人信息等有用的数据库。
你将在第6章学习怎样创建和使用Content Provider。
Intents(意图)简单的消息传递框架。
使用Intent,你可以在整个系统内广播消息或者给特定的Activity或者服务来执行你的行为意图。
系统会决定那个(些)目标来执行适当的行为。
Broadcast Receivers(广播接收器) Intent广播的“消费者”。
通过创建和注册一个Broadcast Receiver,应用程序可以监听符合特定条件的广播的Intent。
Broadcast Receiver 会自动的启动你的Android应用程序去响应新来的Intent。
Broadcast Receiver是事件驱动程序的理想手段。
Notifications(通知) 用户通知的框架。
Notification用来在不需要焦点或不中断它们当前Activity的情况下提示用户。
它们是Service或 Broadcast Receiver获得用户注意的首选方式。
例如,当设备收到文本信息或外部来电时,它通过闪光,发声,显示图标或显示对话框信息来提醒你。
在第8章里,你可以使用Notification来触发这些事件。
一、Activity详解 Activty的生命周期的也就是它所在进程的生命周期。
一个Activity的启动顺序:onCreate()——>onStart()——>onResume()当另一个Activity启动时:第一个Activity onPause()——>第二个ActivityonCreate()——>onStart()——>onResume()——>第一个ActivityonStop()当返回到第一个Activity时:第二个Activity onPause()——>第一个ActivityonRestart()——>onStart()——>onResume()——>第二个Activity onStop()——>onDestroy()一个Activity的销毁顺序:(情况一)onPause()——><Process Killed>(情况二)onPause()——>onStop()——><Process Killed>(情况三)onPause()——>onStop()——>onDestroy()每一个活动( Activity )都处于某一个状态,对于开发者来说,是无法控制其应用程序处于某一个状态的,这些均由系统来完成。
但是当一个活动的状态发生改变的时候,开发者可以通过调用 onXX() 的方法获取到相关的通知信息。
在实现 Activity 类的时候,通过覆盖( override )这些方法即可在你需要处理的时候来调用。
一、 onCreate :当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。
onCreate 方法有一个参数,该参数可以为空( null ),也可以是之前调用onSaveInstanceState ()方法保存的状态信息。
二、 onStart :该方法的触发表示所属活动将被展现给用户。
三、 onResume :当一个活动和用户发生交互的时候,触发该方法。
四、 onPause:当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。
这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。
五、 onStop :当一个活动不再需要展示给用户的时候,触发该方法。
如果内存紧张,系统会直接结束这个活动,而不会触发 onStop 方法。
所以保存状态信息是应该在onPause时做,而不是onStop时做。
活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。
因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。
在一些情况下,onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。
六、onRestart :当处于停止状态的活动需要再次展现给用户的时候,触发该方法。
七、 onDestroy:当活动销毁的时候,触发该方法。
和 onStop 方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。
· onSaveInstanceState :系统调用该方法,允许活动保存之前的状态,比如说在一串字符串中的光标所处的位置等。
通常情况下,开发者不需要重写覆盖该方法,在默认的实现中,已经提供了自动保存活动所涉及到的用户界面组件的所有状态信息。
Activity栈上面提到开发者是无法控制Activity的状态的,那Activity的状态又是按照何种逻辑来运作的呢?这就要知道Activity 栈。
每个Activity的状态是由它在Activity栈(是一个后进先出LIFO,包含所有正在运行Activity的队列)中的位置决定的。
当一个新的Activity启动时,当前的活动的Activity将会移到Activity 栈的顶部。
如果用户使用后退按钮返回的话,或者前台的Activity结束,活动的Activity就会被移出栈消亡,而在栈上的上一个活动的Activity将会移上来并变为活动状态。
如下图所示:一个应用程序的优先级是受最高优先级的Activity影响的。
当决定某个应用程序是否要终结去释放资源,Android内存管理使用栈来决定基于Activity 的应用程序的优先级。
Activity状态一般认为Activity有以下四种状态:活动的:当一个Activity在栈顶,它是可视的、有焦点、可接受用户输入的。
Android试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用。
当另外一个Activity被激活,这个将会被暂停。
暂停:在很多情况下,你的Activity可视但是它没有焦点,换句话说它被暂停了。
有可能原因是一个透明或者非全屏的Activity被激活。
当被暂停,一个Activity仍会当成活动状态,只不过是不可以接受用户输入。
在极特殊的情况下,Android将会杀死一个暂停的Activity来为活动的Activity提供充足的资源。
当一个Activity变为完全隐藏,它将会变成停止。
停止:当一个Activity不是可视的,它“停止”了。
这个Activity将仍然在内存中保存它所有的状态和会员信息。
尽管如此,当其它地方需要内存时,它将是最有可能被释放资源的。
当一个Activity停止后,一个很重要的步骤是要保存数据和当前UI状态。
一旦一个Activity退出或关闭了,它将变为待用状态。
待用:在一个Activity被杀死后和被装在前,它是待用状态的。
待用Acitivity被移除Activity栈,并且需要在显示和可用之前重新启动它。
activity的四种加载模式在的多activity开发中,activity之间的跳转可能需要有多种方式,有时是普通的生成一个新实例,有时希望跳转到原来某个activity实例,而不是生成大量的重复的activity。
加载模式便是决定以哪种方式启动一个跳转到原来某个Activity实例。
在android里,有4种activity的启动模式,分别为:·standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。
·singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。
如果不位于栈顶,会产生一个新的实例。
·singleTask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。
·singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。