首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

Android学习笔记--Android开发时常用控件(三)

ProgressBar(进度条) ListView(很重要的显示控件) 例:<ProgressBarandroid:id="@+id/pBar" Style="?Android:attr/progressBarStyleHorizontal"--水平方向的进度条 Android:layout_width="200dp" Android:layout_height="wrap_content" Android:visibility="gone" Android:max=200 /> 代码:1.声明变量 2.根据ID取得控件对象findViewById 3.设置监听类 ClassButtonLinstenerimplementsOnClickListener{ PublicvoidonClick(Viewv){ If(i==0){ pBar.setVisibility(View.VISIBLE); } Elseif(i<pBar.getMax()){ pBar.setProgress(i);--设置主进度条的当前值 pBar.setSecondaryProgress(i+10);--设置第二进度条的当前值 } Else{ pBar.setVisbility(View.GONE); } I=i+10; } } 4.绑定事件 myButton.setOnClickListener(newButtonLinstener()); 例:main布局文件 <ListViewandroid:id="@id/android:list" Android:layout_width="fill_parent" Android:layout_height="wrap_content" Android:drawSelecrorOnTop="false" Android:scrollbars="vertical"/> User布局文件略(两个TextView) 代码:publicclassActivityextendsListActivity{ super.onCreate(savedInstanceState); setContentView(R.layout.main); //用一个集合对象装数据 ArrayList<HashMap<Stirng,String>>list=newArrayList<HashMap<Stirng,String>>(); HashMap<String,String>Map1=newHashMap<String,String>(); HashMap<String,String>Map2=newHashMap<String,String>(); HashMap<String,String>Map3=newHashMap<String,String>(); Map1.put("user_name","zhangsan"); Map1put("user_ip","192.168.0.1"); Map2.put("user_name","lisi"); Map2.put("user_ip","192.168.0.2"); Map3.put("user_name","wangwu"); Map3.put("user_ip","192.168.0.3"); List.add(Map1); List.add(Map2); List.add(Map3); //listActivity对象,map,第二个布局文件,对应hashMap的值对(可想象成列),控件显示的位置 SimpleAdapterlistAdapter=newSimpleAdapter(this,list,R.layout.user,newString[]{"user_name","user_ip"},newint[]{R.id.user_ip,R.id.user_name}); setListAdapter(listAdapter); } //重写 ProtectedvoidonListItemClick(ListViewlv,Viewv,intposition,longid){ super.onListItemClick(1,v,position,id); System.out.println("id--------"+id); System.out.println("position-------"+position) } 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360573,如需转载请自行联系原作者

优秀的个人博客,低调大师

【移动开发】Android中Theme和Style的使用

当我们做项目到一定程度的时候,Android提供给我们的简单的UI控件(虽然后期ADT插件更新中增加了不少)已经不能满足我们的需要,一款成功的软件不仅要功能强大,漂亮的界面同样会吸引不少用户! 这里,我将总结一下Android提供给我们的两个重要的资源:Theme 和 Style。 1.Theme(是针对窗体级别的,可以改变窗体样式) 官方文档 Themes are Android's mechanism for applying a consistent style to an app or activity. The style specifies the visual properties of the elements that make up your user interface, such as color, height, padding and font size. To promote greater cohesion between all apps on the platform, Android provides three system themes that you can choose from when building apps for Ice Cream Sandwich: 主题是Android的机制被应用一个相同风格的应用程序或Activity中。样式指定了视觉属性的元素装饰你的用户界面,如颜色、高度、填充和字体大小。促进更大的凝聚力在所有平台的应用程序,Android提供了三个系统的主题,您可以选择在构建应用程序选择不同的主题: Holo Light Holo Dark Holo Light with dark action bars 官方图: 1.1.使用 Android系统的themes.xml和style.xml(位于/base/core/res/res/values/)包含了很多系统定义好的style,建议在里面挑个合适的,然后再继承修改。以下属性是在Themes中比较常见的,源自Android系统本身的themes.xml: 1 2 3 4 5 6 7 8 < style name = "simple_dialog" parent = "@android:style/Theme.Dialog" > < item name = "android:windowFrame" >@null</ item > <!-- Dialog的WindowFrame框为无 --> < item name = "android:windowNoTitle" >true</ item > < item name = "android:windowIsFloating" >true</ item > <!-- 是否悬浮在activity上 --> < item name = "android:windowIsTranslucent" >true</ item > <!-- 是否半透明 --> < item name = "android:backgroundDimEnabled" >false</ item > <!-- 背景是否模糊 --> </ style > 有人会问从哪里学习这些主题?其实系统就自带了很多,看下图: 在AndroidManifest的Application中,点击Theme选项,系统资源里就有相当多的主题供你选择。 A.应用到Application 1 <application android:theme= "@style/CustomTheme" > B.应用到Activity 1 <activity android:theme= "@android:style/Theme.Dialog" > 2.Style(是针对窗体元素级别的,改变指定控件或者Layout的样式) 官方文档: A style is a collection of properties that specify the look and format for a View or window. A style can specify properties such as height, padding, font color, font size, background color, and much more. A style is defined in an XML resource that is separate from the XML that specifies the layout. 风格是一个集合的属性用于指定具有一定外观和格式的视图或窗口。一个风格可以指定属性如高度、填充、字体颜色、字体大小、背景色等等。一个样式定义在XML资源,独立于XML指定布局。 Styles in Android share a similar philosophy to cascading stylesheets in web design—they allow you to separate the design from the content. 风格在安卓中的份额就如同级联样式表在web设计中的设计,允许你将内容分割开来设计 2.1简单使用 一个简单地样式 1 2 3 4 5 6 < TextView android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:textColor = "#00FF00" android:typeface = "monospace" android:text = "@string/hello" /> 可以在任何相同的地方被引用 1 2 3 <TextView style= "@style/CodeFont" android:text= "@string/hello" /> 2.2定义风格 首先可以在res/values/下创建一个xml,用于定义style(注意:根结点必须是<resources>) 1 2 3 4 5 6 7 8 9 <? xml version = "1.0" encoding = "utf-8" ?> < resources > < style name = "CodeFont" parent = "@android:style/TextAppearance.Medium" > < item name = "android:layout_width" >fill_parent</ item > < item name = "android:layout_height" >wrap_content</ item > < item name = "android:textColor" >#00FF00</ item > < item name = "android:typeface" >monospace</ item > </ style > </ resources > 这里我们可以看到,该style的名称为CodeFont,parent后面是父类的style,(当然,我们也可以不用继承父类style),接下来每一个item定义一个属性。定义属性的最好方法就是在api文档里找到这个view的xml属性,比如在EditText中有InputType这个属性,那么在你的style里面你就可以来定义它。 ok! 就是这些了! 本文转自zhf651555765 51CTO博客,原文链接:http://blog.51cto.com/smallwoniu/1251507 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android应用开发以及设计思想深度剖析(2)

特别声明:本系列文章LiAnLab.org著作权所有,转载请注明出处。作者系LiAnLab.org资深Android技术顾问吴赫老师。 上节讲述了应用编程的背景,本节主要讲述Android应用的编程思想。 Android 的系统设计,与别的智能手机操作系统有很大区别,甚至在以往的任何操作系统里,很难找到像Android这样进行全面地系统级创新的操作系统。从创新层面 上来说,Android编程上的思想和支持这种应用程序运行环境的系统,这种理念本身就是一种大胆的创新。 整个Android系统,实际主要目的,就是打造一个功能共享的世界。 功 能共享最重要的交互,于是Android创造出一种Intent和IntentFilter配合的低耦合的交互模型,Intent只是一种描述要完成什么 工作跨进程的结构体,而最终如何解析这些Intent并完成其响应,是由IntentFilter来进行换算,最终是由用户来决定如何完成。 而在Intent这种超级交互消息之上,Android进一步把应用程序的实现逻辑拆分成多种特殊的实现: ÞActivity:带显示与交互能力的部分 ÞService:不带显示与交互能力的部分 ÞContent Provider:在功能交互之外,提供数据交互能力的部分 ÞBroadcast Receiver:用来处理广播交互的部分 这四种功能上的拆分,也体现了Android设计者在设计上抽象思绪能力,即便是随着Android迅猛发展,目前已经到了4.1这么功能丰富、用户体验良好的状态,我们编程也还是与这四种功能组件打交道,可以满足我们任何的编程时所需要的任何行为。 而这四种基本组件组成部分,使Android应用程序反倒成了一个“空壳子”。静态上看,应用程序只是一种包装这些功能的容器;从运行态来看,所谓的应用程序,也只是承载某些功能的进程。 1.1 所谓的Android应用程序 我们从前面的例子中看到,无论是编写的代码,还是最后生成的.apk文件,都是没有所谓的应用程序的。应用程序本身是一种虚无的概念,只是一种以zip格式进行压缩的一个文件,一种容器而已。 如 我们前面的Helloworld的例子里所看到的那样,其实一个应用程序里最重要的一个配置文件就是AndroidManifest.xml文件。一个最 简单的项目,除了基本的代码与UI资源,也会需要有个AndroidManifest.xml文件。甚至一些极端一点的例子,我们去市场上下载一些什么主 题包、插件包、权限包之类的.apk文件,解压开,这时可以发现这样的.apk文件里,连代码都没有,只有一些图片之类的文件。 于是,我们 可以得到Android里关于应用程序的第一个印象,作为Android应用程序的载体,.apk文件只是一种进行包装与传输的格式,而每个.apk文件 必然包含一个AndroidManifest.xml文件,由这一文件来描述该.apk文件提供的内容。当然,我们在稍后会看到,这一文件里,还会包含一 些权限控制的信息。 我们可以给我们的应用程序创建两个一模一样的图形界面,直接从我们的前面的HelloWorld开始下手,比如将 HelloWorld.java在Eclipse里拷贝到HelloAgain.java(这样可以减少改代码的麻烦)。这时可以得到两个界面的应用程 序,然后我们再把我们的AndoridManifest.xml文件,改成如下的样子: <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="org.lianlab.hello" android:versionCode="1" android:versionName="1.0"> <applicationandroid:label="@string/app_name"> <activityandroid:name=".Helloworld" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activityandroid:name=".HelloAgain" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest> 这时我们编译、安装到Android设备(或者是虚拟机)里,这时再打开主界面查看安装过的应用程序,这时是不是发生了什么很奇怪的现象?这时界面上会出现 两个叫Helloworld的应用程序。我们这时如果在设备里去“设置”à “应用程序”,我们仍只看到一个应用程序。 通过对 AndroidManifest.xml的小恶作剧,我们可以看到Android应用程序的第二个特点,就是没有所谓的主入口(即我们点击的图标时触发的 执行效果)。应用程序在安装完成后,只是通过AndroidManifest.xml来决定在系统上应该表现成什么样子。 如果希望应用程序 可以表现不如此变态,这时,我们可以回到AndroidManifest.xml里, 把<activityandroid:name=".HelloAgain"…这个标签里的<intent-filter>标签删掉, 这时应用程序的表现就正常了。 到目前为止,我们就已经接触了android编程里的两个概念,一个是Activity,另一个是 Intent(而我们AndroidManifest.xml文件里的Intent Filter实际是辅助Intent的)。Android毕竟是种图形界面的编程环境,我们常见的应用程序里,可能绝大部分只会与这两种概念打交道。而两 者的概念组合,就很容易体现出Android应用程序在编程上的“无界化”思想。 1.2 Android世界里的共享 作 为一个智能手机操作系统,其用户可能在功能上有各种各样的功能组合。比如最简单的打电话,则后续动作会有保存联系人,同时需要给联系人拍照做来电大头贴。 又比如需要来了个短信通信用户到某个地方干什么事情,这时,用户需要打开地图,搜索一下地址,然后还有可能需要定位到那个位置。 用户在主界面里点击相应功能的应用程序之后,就可能有非常多的功能性的组合,因为用户的想法是不可预估的。我们当然也可以限制用户当前菜单下可以干什么事情,但这样就失去了智能系统的意义。 我 们也可以假设用户都会按一个“Home”键回到主界面,这时原来的执行的程序就会被锁定当前状态,用户重新打开另外一个应用程序,操作完再按“Home” 键可以退回到原来的应用程序。通过这种“应用程序”到“Home”到“应用程序”的循环,我们也可以达到我们想要达到的目的。但这时,出于交互性的考虑, 我们也还是需要有限地提供一些交互手段,比如“短信”应用程序里包含地址信息,一点击可以直接打开“地图”进行后续操作,但这些有限交互是可以在系统设计 阶段被固化。这时,我们是不是就得到了我们想要的能够应付用户任何操作组合的系统?是的,恭喜您,您得到了iPhone的设计思路。但此时的用户交互流程 则被改变成这个样子: 这种解决问题的办法也不是不可以,但需要很固化的设计,应用程序的行为比较受限。虽然通过横扫全世界的 iPhone证明了这样的设计可能是比较合乎用户体验之道的(不容易出错),但这样的解决思路从系统设计角度来看,并不是很灵活。另外一个麻烦是必须要有 苹果级设计功底的“Home”键,山寨货则用不了多久就会因为键盘失灵而失效。当然即使苹果级设计,iPhone里的“Home”键还是会失效,于是又不 得不在屏幕上加上触摸的Home手势。 作为开源系统的Android,当然不可能基于iOS的交互思路来解决问题,何这种交互时多了一步不 停要回到主界面这一步。在Android的设计里,最重要的是能够解决一个应用程序之间进行交互的问题,然后可以实现我们想要在Android系统里完成 某种操作时,可以享受从一路顺畅完成的快感。 Android的解决之道,则是将传统意义上的应用程序,细化成一个个完成某项功能的部分,这 种功能部分,在Android世界里被称为Activity。Activity都应该被设计成可以独立地被执行以解决某个问题,当它完成或是用户选择退出 执行时,又会自动跳回到调用这一Activity的界面,当然这时跳回的位置肯定是另外一个Activity。当然,在一个Android系统里有可能存 在无限多的Activity,在他们进行跳转切换时,我们就需要一种很灵活的消息传输机制(因为我们必须兼容系统里所有可能的互相调用的情况)。而且这种 传输机制还必须能够跨进程,不然,我们所有的涉及Activity互相调用部分都必须在同一进程里完成。于是,Android系统里又有了Intent, 用于解决交互通信。 这样的编程模型也需要有一定前提,那就是我们Application概念必须被弱化,我们不能有main 函数入口(如果系统执行依赖main作入口,则不能实现Activity之间互相调用了,所有的Activity执行之前,必须先通过main入口来初始 化环境)。出于这样的设计,所以Application必须只是一个容器,将各种不同的Activity实现包装起来加载到系统里。 当然, 将功能拆分成一个个的单一功能界面之后,我们需要有种机制可以将用户一路点击过去历史记录下来,当用户处理完时,可以退回到他们之前操作过的界面,这次就 可以由多个应用程序组合出像是在用同一个应用程序的效果。有了Activity,有了Activity之间起到调用作用的Intent,这时所有界面间操 作变得有点像是函数调用一样,于是我们可以找函数调用时的基本数据结构—栈来帮忙,发生调用时,需要退出的Activity及其状态压栈,当从调用退出时 则进行栈的弹出操作,这时我们的Activity管理就演变成如下图所示的简单栈管理。 有了这样的概念,于是我们响应用户点 击操作的问题便迎刃而解,我们在设计应用程序时,不再是设计一个复杂的功能实现,而是实现一组完成单项功能的实现,也就是Activity。然后这些 Activity,只会通过用户点击来驱动它们之间是如何进行交互的。比如,我们前面看到的地图、搜索、定位三个功能,虽然它都会被包装到同一个地图的应 用程序里,但在实现上会是地图、搜索、定位三个不同的Activity。 因为现在我们的界面上的互相调用,已经变成了一种函数式的调用,这 样,整个手机上的功能都被切分成各个单一的小功能,而真正要在Android系统上完整地实现某复杂个操作,则会提交由用户的点击来组合生成。这样的复杂 功能,则已经不是一个编程上的概念了,在Android系统里,这种需要完成什么事情的操作被抽象成一个虚拟的概念Task。比如我们前面提到的打电话加 拍大头贴的操作组合,就构成一个Task,这一Task需要由Launcher.apk,Contacts.apk,Gallery.apk来协同完成。 如 果我们有两个能够提供同样功能的Activity,这种执行模式的灵活性表现得会更加明显。比如中间打电话的功能,我们系统里有三个 Activit(CallScreen, SipPhone, Dialer)都可以完成电话呼叫的功能,这时执行上的路径则会有三种可能性,会在进行跳转时弹出对话框由用户来选择: 通 过Activity的这种可以动态被用户选择的特点,当用户对某一功能不满意时,完全就有可能通过下载另一个能实现这种功能的应用程序进行替换,甚至可以 自己写一个。事实上,Android系统里除了系统状态条与锁屏界面之后,没有任何的不可被替换的功能,这也是Android设备总是会长得千奇百怪的原 因之一。 到这时,我们就可以看到Activity之所以会不被称为Window的原因,它也是单个界面或是MVC里的Controller 实现部分那么简单,Activity这个名字代表的是某种单一交互功能上的实现。这种功能的实现将在系统里通过Intent串接起来,构成了一个在功能上 具备极大可拓展性的系统。基于这样的特点,Android也就被称作是“无边界”系统,因为它在功能上延展不再受限于系统的能力,而只受限于智商与创意。 这就是Android世界里的功能共享。 在这种功能共享模型之下,可能还是会有一些微调的需求: 1.我 们有一些情况下不宜使用这种栈式Activity管理,比如我们写一个需要注册的应用程序,注册完开始使用,然后再按退出,我们又会一步步退回到注册填个 人信息的界面,而不合理地完全退出。这样可能不合适。这时,我们可以使用Intent的Flag参数, 加上Activity的Affinity属性进行组合控制。 2.如果不停地跳出对话框让用户选,用户会崩溃掉。 当然,用户可以在选择时点选一个“始终”的默认选择,这时下次就会使用默认的Activity处理某种操作。但还是有可能会不合理地使用跨.apk文件里 使用Activity,造成性能上的开销,这时,我们也可以在执行下次Activity执行操作时进行强制性地指定。 当然,我们通过 Activity这种概念还需要另外一个前提,这就是Android会有别于传统操作系统的前提,那就是单窗口。想像一下,在多窗口环境下,我们的栈式管 理Activity在进行跳转和返回时将会构成多大的灾难啊。好在使用电容屏的设备,单窗口是天生的需求。由于手指触摸的精度非常低,无法点准过小的按 钮,比如窗口上的关闭按钮,如果将这些按钮放大,又造成了屏幕显示空间上的浪费。iPhone带来的“后PC时代”革命,最重要的一点就是使用“返祖”式 的单窗口显示。 这种怪异的操作方式,实际上在我们生活中也有类似的例子,就比如说我们的动态网页。动态网页,特别是HTML5构建的网络应 用程序,其操作模式,就是可以在不同的链接里不断地点击下去,如果不是弹出新窗口,我们始终还可以退回到发起这一连串点击的起始页面。Android应用 程序,XML构成的UI语言的作用跟Html页面类似,而Java构建的Activity就相当与网页交互中使用的JavaScript,有了这样的相似 性,Android编程环境可以说是最接近HTML5的一种编程环境了,但可惜不能像HTML5那样可以跨平台。 我们解析了能完成单一功能 的Activty,这时还需要了解Intent,就像是我们了解过了函数实现原理,我们还需要掌握函数之间的参数传递。当然,一般在介绍编程的思路里,会 结合起来说明,或是先说明参数传递。但Android环境里有点特殊性,一是Intent是一种能够实现跨进程调用的信息传递机制,二是Intent在消 息传递上又很灵活,有一定的动态性。Intent不光服务于Activity之间的调用,还会用于一些不直接与界面打交道的逻辑实现部分,比如我们后面将 提到的Service,Broadcast Receiver,以及 Notification。 1.3 Intent与Intent Filter Intent, 英文原意就是要“干什么”的意思,之所以取这个名字,也是因为在Android系统里,Intent所起到的作用就是用来指明下一步具体是做什么,具体是 不是执行,由谁来执行,则会由根据当前的系统状态(能不能解析这个Intent请求)来决定。这不只是简简单单地发个消息而已,而是一种更安全的、更加松 散的消息机制。 在一个Intent消息对象里,共有六个成员(并不都是必须赋值的,只要一个Intent对象能够被解析,就会得以执行,否则就会会被舍弃): 成员 类型 说明 示例 ComponentName String 用于定义谁将处理这一Intent。它由一个Activity的具体实现的全名(加上包名)来指定 org.lianlab.hello.HelloActivity Action String 用于定义这一动作是做什么,可以被拓展自定义类型 ACTION_CALL 开始通话. ACTION_EDIT 进行编辑. Data String 用一个URI来指定Intent的操作对象,因为URI一般会包含种类信息,于是这个值也可能被用作MIME设别。 “content://contacts/people/1” 指定联系列表中的第一个 Category String 用来进一步明确什么样的可执行实体将处理这一Intent。是可选项,也可多选。 CATEGORY_HOME 主界面应用程序 CATEGORY_LAUNCHER 可在主界面里被点击 Type String 用来指定特定的MIME类型 "video/*" 视频 Extra Bundle 用来传递额外的数据传递,前面我们也介绍了Bundle是一种key:value配对的字典类型,于是Extra里可以转递复杂的数据 putExtra("sms_body", "some text"); 发短信时指定内容 Flags int 预定义一系列用来控制Intent行为的属性值 在 这个成员变量里,最能体现灵活性的就是Component,如果指定了这个值,则我们在通过startActivity()方法来发送Intent时,就 会自动启动Component指定的Activity。如果没有指定,则会由系统来选择一个能够处理这一Intent的Activity来执行,这时就引 入了Intent Filter的概念。 Intent Filter在Android里是一种类似于Windows里的注册表一样的东西,虽然我们也可以通过编程来进行Intent Filter的控制,但一般情况下,我们只在AndroidManifest.xml文件里进行定义,对它一个<intent- filter>的标签进行指定。应用程序在安装过程中,它的AndroidManifest.xml会被系统扫描并汇总到系统环境里,这 时<intent-filter>也会被导入。当Activity发送出来的Intent,没有指定Component时,系统就会通 过<intent-filter>找到合适的处理对象,如果只有一个或是用户设置了默认项,则启动这个功能部件来完成任务;如果有多 个<intent-filter>匹配同时用户又没有指定默认项,则会弹出对话框让用户选择。当然,默认项也会随着系统里新增了同一 Intent匹配项而失效,用户也可以通过“设置”à “应用程序”来取消默认值。 在AndroidManifest.xml里面定义<intent-filter>很简单,就是通过指定Intent对象的Action,Data,Type,和Category这四个成员变量来指定。比如: <activityandroid:name=".PlayerActivity"android:label="@string/app_name" android:configChanges="orientation"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> <intent-filter> <actionandroid:name="android.intent.action.VIEW"/> <categoryandroid:name="android.intent.category.DEFAULT"/> <dataandroid:scheme="file"/> </intent-filter> ... </activity> 当我们的某个Activity,发送了一个Intent,其Action是”android.intent.action.VIEW”,data又是以file:///开始的URI指定的内容(也就是文件类型),这时上面例子里的PlayerActivity就会成为播放时的候选项。 我 们可以继续修改我们前面的HelloWorld的例子,我们新建一个Intent,将Action设 成”android.intent.action.VIEW”(可以通过Intent.ACTION_VIEW这个预变量来转义),data使用某个文件 “file:///sd-ext/Movies/test.mp4”,这时就会匹配到我们上面的<intent-filter>定义: publicvoidonClick(Viewv) { Intent request =newIntent(Intent.ACTION_VIEW); request.putData(“file:///sd-ext/Movies/test.mp4”); startActivity(request); finish(); } 当然,我们并不一定需要代码来进行这样的测试,我们也可以使用设备上的am命令来完成。要完成与上面的点击操作一样的功能,也可以通过adb来执行这条命令: $adb shell am start –aandroid.intent.action.VIEW –d file:///sd-ext/Movies/test.mp4 在我们具体写代码过程中,我们可以根据需求来定义我们所需要的<intent-filter>,可以将过滤规则写得很细,也可以写得很粗,让我们的Activity有更多地被执行到的机会。在这些规则里,可能最重要的规则,就是我们前面也示范过的: <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> 这两行<intent-filter>规则,将使用我们的应用程序可以被主界面所收集,使用户可以在主界面里点击运行这个Activity。 有了Activity,我们就可以构建基于功能共享而实现所谓应用程序,而有了Intent,使用我们在共享时所受的限制可以变得更小。而且,由于是简单化的单窗口模式,再加上一些在性能设计上的精细设计,于是我们的Android系统便有了良好的人机交互体验。 1.4 编程角度的应用程序 光 有Activity与Intent,并不是Android应用程序编程时的全部。应用程序除了有人机交互界面之外,有可能还需要使用到一些不直接与人交互 而在后台长期运行操作;我们还需要有某种机制,能够提供数据共享,并且在数据共享时能使用统一的访问机制;最后,我们可能还需要处理以广播方式发送的消 息,广播与Intent不同之处在于一到多的方式传播,同时消息只在某个时间段内有效。 事实上,我们的Android编程,是被包装成四个不同的类型,同时通过Intent将这些类包装起来,以解决我们上面提到的,在编写图形应用程序里可能遇到的问题的: lIntent: 全局性的、松散的消息传递机制 lActivity:带图形界面的,可以与用户进行交互的逻辑实现。 lService: 不带图形界面的,不直接与用户交互的代码。一般会被用于在后台做些什么事情,比如监听网络、下载、拷贝文件等。(这可能是一般的Android工程师觉 得没有必要实现的部分,笔者在讲解Android应用程序相关的课程时,就常有问及,Actiivity会进入到后台,然后有可能被杀死掉,这样的问题如 何解决?实际上Activity只解决交互,需要在后台时还需要继续执行的代码,需要用Service来实现。只自己可访问的Service,可以使用简 单的本地Service,而需要提供给别的进程来访问的情况下,我们需要通过AIDL编写Remote Service。Service的实现,我们在后台再详细说明,因为Android系统的核心Framework,本身就是由大量这样的Remove Service来组成的。) lContent Provider: 提供数据层共享,以CRUD(Create Read Update Delete)方式进行数据访问来统一化数据读写指口一种模型。如果使用了Sqlite做后台的数据支持(实际上相当于应用程序MVC模型里的Model 部分被Sqlite延展开来),我们可以通过ContentProvider来各系统内的其他部分提供数据源,当然系统本身也给我们提供了大量这样的 ContentProvider,像Setting里的设置的值、联系列表、多媒体文件扫描结果等。(这种数据层上的共享机制,也是应用程序编程上需要加 强的技巧之一,因为有了Content Provider,我们则有可能使用Cursor式进行访问,这时我们就可以使用CursorAdapter来自动化地处理数据源。) lBroadcast Receiver: 处理广播类消息的监听器,从而可以给应用程序提供广播式的信息处理,同时也提供系统消息的广播式分发。比如,Android会将一些系统事件广播出来,像 电话振铃、电量状态变化、网络状态变化等,我们需要能够处理这样的事件,电话振铃时我们写的多媒体播放器就应该静音、电量过低时需要保存状态等。对我们应 用程序而言,广播方式也是一种很好的通信机制,我们不需要写一个循环通知所有的Activity、Service我们状态发生了改变,而只需要发一个广 播,则所有关心这一事件的部分都可以收到。 这些功能实体,都是我们通过Java代码根据不同的基类(Service、 ContentProvider、BroadcastReceiver)派生出相应的子类,再加以具体实现。这样的功能实现不需要自己去创建这个对象,会 通过AndroidManifest.xml里的定义,由系统按执行的需要自动创建。有了这些不同的功能实体,我们最后的应用程序,实际上就成了这个样 子: 而我们的所有代码,从运行态行为来看,都不再是直接的互相调用关系,而是全部都通过Intent来进行彼此之间的交互。而这样的交互,也不再是传统式地自己陪自己玩,而是会进入到一个大的功能集合体时,提供功能给系统内其他应用程序所使用,而自己也会调用其他部分的代码。 当然,随着Android版本变更,Android系统又新增了一些新的概念,比如针对多窗口功能的Fragment、针对于使用异步机制操作Cursor的Loader等。但万变不离其宗,这些Android的核心原理则一直如此。 总 结一下Android编程思想,我们就会知道其实在Android整个生态环境最重要的元素,应用程序,反倒是Android编程上最不重要的。所谓的 Android编程,就是要通过编写一个个的Activity、Service、Content Provider、Broadcast Receiver实现,通过功能上的共享与数据上的共享进一步丰富用户可用的功能。当用户可以通过Market或自己下载取得我们封装到.apk文件里的 实现之后,这些功能就会无缝地被Intent整合到了一起。 从Android这个编程原则来看,我们可以看到,如果我们使用某种Java执 行环境,将Android应用程序的这些组成部分的支持都加入进来,我们也可以得到一个Android兼容的环境。的确如此,已经有人在打这方面的主意, 有将Android环境移植到Windows环境里的BlueStack商业解决方案,也有号称兼容Android应用程序,通过一个类似于JAVA ME的虚拟机环境来支持Android应用程序的BlackBerryOS。但我们可以再来看看Android的真正的支持环境,我们可以看 到,Android有其独特的特性,也不是那么容易被取代。 本文转自 21cnbao 51CTO博客,原文链接:http://blog.51cto.com/21cnbao/975590,如需转载请自行联系原作者

优秀的个人博客,低调大师

iOS开发:Objective-C数据类型转换

按照数据类型占用存储不同可以自动类型转换或强制类型转换,总的原则是小存储容量数据类型可以自动转换成为大存储容量数据类型。 不同类型数据间按照下面关系的从左到右(从低到高)自动转换, _Bool 、 char 、 short int 、枚举类型 -> int ->long int->long long-> float -> double -> long double 。 如果这些数据类型进行混合运算,运算中不同类型的数据先转化为同一类型,然后进行运算,转换从左到右自动转换,如表 2-3 所示。 表 2-3 类型转换先后顺序表 如果有下面的表示式,其中, f 是 float 类型, i 为 int 类型, l 为 long int 类型, s 为 short int 类型,结果是什么类型? f * i + l /s 运行结果为 float 类型,这是因为 f 是 float 其它的操作数与 float 运算其结果就是 float 类型。 如果遵守类型转换是右到左情况,就需要强制类型转换 了,强制类型转换语法形式上很简单,就是在数据前面加上(目标类型),但是这种转换是存在风险的,有可能造成数据的丢失,需要谨慎进行。例如: long int l = 6666666666; NSLog(@"l = %li",l); int i = (int)l; NSLog(@"i = %i",i); 运行的结果是,其中 6666666666 数值已经超出了 int 类型的容量,因此出现了数据的丢失。 l = 6666666666 i = -1923267926 强制转换有的时候嵌入在其它的表达式里面,它会与运行的优先级交织在一起,情况就会变的更加复杂,假设有下面的几条语句: int total = 3446; int n = 6; float average = total / n; 运行完成 float 的变量 average 结果是 574 ,小数点内容被截取掉了,如果我们采用下面的语句实现: int total = 3446; int n = 6; float average = (float)total / n; 运行完成 float 的变量 average 结果是 574.333 ,这个数据要比上面计算的精确,这是因为 (float)total 先把 int 类型的 total 变量转换成为 float 类型的 total 变量。 本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/818591,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android中的GPS应用开发入门教程

】LBS(Location Based Services)直译的话就是基于地理位置的服务,这里面至少有两层意思,第一要能轻易的获取当前的地理位置,譬如经纬度海拔等,另一个就是在当前位置的基础上提供增值服务,譬如找附近的加油站、餐馆、酒店等。这里面的第一步:获取用户当前位置,我们就可以用Android的GPS定位服务来得到。Android提供了基于网络的定位服务和基于卫星的定位服务两种。在设置->位置和安全设置里面的前三项就是,最后一个增强型GPS是为了辅助快速找卫星的。 那么我们现在就写一个简单的程序来实现获取当前位置的功能。 1、新建项目Lesson26_GPSLocation 2、MainActivity.java的代码如下: package basic.android.lesson26; import android.app.Activity; import android.content.Context; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { TextView tv1; Location location; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 定义UI组件 Button b1 = (Button) findViewById(R.id.button1); tv1 = (TextView) findViewById(R.id.textView1); // 获取LocationManager对象 LocationManager lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); // 定义Criteria对象 Criteria criteria = new Criteria(); // 设置定位精确度 Criteria.ACCURACY_COARSE 比较粗略, Criteria.ACCURACY_FINE则比较精细 criteria.setAccuracy(Criteria.ACCURACY_FINE); // 设置是否需要海拔信息 Altitude criteria.setAltitudeRequired( true ); // 设置是否需要方位信息 Bearing criteria.setBearingRequired( true ); // 设置是否允许运营商收费 criteria.setCostAllowed( true ); // 设置对电源的需求 criteria.setPowerRequirement(Criteria.POWER_LOW); // 获取GPS信息提供者 String bestProvider = lm.getBestProvider(criteria, true ); Log .i( " yao " , " bestProvider = " + bestProvider); // 获取定位信息 location = lm.getLastKnownLocation(bestProvider); // 给按钮绑定点击监听器 b1.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { updateLocation(location); } }); // 位置监听器 LocationListener locationListener = new LocationListener() { // 当位置改变时触发 @Override public void onLocationChanged(Location location) { Log .i( " yao " , location.toString()); updateLocation(location); } // Provider失效时触发 @Override public void onProviderDisabled( String arg0) { Log .i( " yao " , arg0); } // Provider可用时触发 @Override public void onProviderEnabled( String arg0) { Log .i( " yao " , arg0); } // Provider状态改变时触发 @Override public void onStatusChanged( String arg0, int arg1, Bundle arg2) { Log .i( " yao " , " onStatusChanged " ); } }; // 500毫秒更新一次,忽略位置变化 lm.requestLocationUpdates(bestProvider, 500 , 0 , locationListener); } // 更新位置信息 private void updateLocation(Location location) { if (location ! = null ) { tv1.setText( " 定位对象信息如下: " + location.toString() + " \n\t其中经度: " + location.getLongitude() + " \n\t其中纬度: " + location.getLatitude()); } else { Log .i( " yao " , " 没有获取到定位对象Location " ); } } } 3、main.xml我就不贴代码了,就一个按钮和一个文本框,等一下看看截图就会明白。 4、要在AndroidManifest.xml中加入权限才行: < ! -- 粗略定位授权 --> < uses - permission = "" android:name = " android.permission.ACCESS_COARSE_LOCATION " ></ uses > < ! -- 精细定位授权 --> < uses - permission = "" android:name = " android.permission.ACCESS_FINE_LOCATION " ></ uses > < ! -- 模拟定位授权 --> < uses - permission = "" android:name = " android.permission.ACCESS_MOCK_LOCATION " ></ uses > < ! -- 网络访问授权 --> < uses - permission = "" android:name = " android.permission.INTERNET " ></ uses > 5、在真机上编译运行程序,查看结果: 这里要说明一下,我在模拟器上提交模拟器数据没成功,在真机上测试也不是很顺利,一和硬件有关就总会出一些莫名其妙的错误…… 本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/736037,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册