首页 文章 精选 留言 我的

精选列表

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

Android开发之:Toast和Notification

之前我们的文章中曾经介绍Dialog,实际上已经实现了提醒功能,在Android中,还可以通过Toast(提醒)和Notification(通知)来实现提醒功能。和Dialog相比,这种提醒更加友好,并且不会打断用户的当前操作。本节详细讲解Toast和Notification控件的级本概述,后续我们会介绍具体使用方法。 Toast简介 Toast是Android中用来显示信息的一种机制,和Dialog不一样的是,Toast 是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失。例如,在下面的代码中,编写了Activity的子类别ToastDemo。 package com.a3gs.toast; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class ToastDemo extends Activity { private EditText myET; private Button myBtn; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myET = (EditText) findViewById(R.id.myET); myBtn = (Button) findViewById(R.id.myBtn); myBtn.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(ToastDemo.this, "您所填的信息是:" + myET.getText ().toString(), Toast.LENGTH_LONG).show(); myET.setText(""); } }); } } 然后编写main.xml文件,其代码如下。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/myText" /> <EditText android:id="@+id/myET" android:layout_width="180px" android:layout_height="wrap_content" /> <Button android:id="@+id/myBtn" android:layout_width="100px" android:layout_height="wrap_content" android:text="@string/BtnText" /> </LinearLayout> 这样,就简单使用了Toast实现了提示功能。执行后的初始效果如图6-61所示;输入信息并单击“发送”按钮后,会以提示的方式显示输入的数据,如图6-62所示。 Notification简介 Notification看名字就知道,是一个和提醒有关的东西,它通常和NotificationManager一块使用。具体来说,其主要功能如下。 1.NotificationManager和Notification用来设置通知 通知的设置等操作相对比较简单,基本的使用方式就是新建一个Notification对象,设置好通知的各项参数,然后使用系统后台运行的NotificationManager服务将通知发出来。基本步骤如下。 1)得到NotificationManager,代码如下。 String ns = Context.NOTIFICATION_SERVICE; NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns); 2)创建一个新的Notification对象,代码如下。 Notification notification = new Notification(); notification.icon = R.drawable.notification_icon; 也可以使用稍微复杂一些的方式创建Notification,代码如下。 int icon = R.drawable.notification_icon; //通知图标 CharSequence tickerText = "Hello"; //状态栏(Status Bar)显示的通知文本提示 long when = System.currentTimeMillis(); //通知产生的时间,会在通知信息里显示 Notification notification = new Notification(icon, tickerText, when); 3)填充Notification的各个属性,代码如下。 Context context = getApplicationContext(); CharSequence contentTitle = "My notification"; CharSequence contentText = "Hello World!"; Intent notificationIntent = new Intent(this, MyClass.class); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); Notification提供了如下几种手机提示方式。 状态栏(Status Bar)显示的通知文本提示,例如: notification.tickerText = "hello"; 发出提示音,例如: notification.defaults |= Notification.DEFAULT_SOUND; notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3"); notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6"); 手机振动,例如: notification.defaults |= Notification.DEFAULT_VIBRATE; long[] vibrate = {0,100,200,300}; notification.vibrate = vibrate; LED灯闪烁,例如: notification.defaults |= Notification.DEFAULT_LIGHTS; notification.ledARGB = 0xff00ff00; notification.ledOnMS = 300; notification.ledOffMS = 1000; notification.flags |= Notification.FLAG_SHOW_LIGHTS; 4)发送通知,代码如下。 private static final int ID_NOTIFICATION = 1; mNotificationManager.notify(ID_NOTIFICATION, notification); 2.更新通知 如果需要更新一个通知,只需要在设置好Notification之后,再调用setLatestEventInfo,然后重新发送一次通知即可。 为了更新一个已经触发过的Notification,传入相同的ID。用户既可以传入相同的Notification对象,也可以是一个全新的对象。只要ID相同,新的Notification对象会替换状态条图标和扩展的状态窗口的细节。 另外,还可以使用ID来取消Notification,通过调用NotificationManager的cancel方法,代码如下。 notificationManager.cancel(notificationRef); 当取消一个Notification时,会移除它的状态条图标以及清除在扩展的状态窗口中的信息。 本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/760497,如需转载请自行联系原作者

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

Android开发21——隐式意图

所谓隐式意图就是在意图激活Activity、Service或BroadcastReceiver这三类组件时,并不显示指出需要显示指出主键的名字,而是通过指定action,data,category,Android系统会根据这三个特征找到最合适的组件并激活。先看自定义的例子 <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activityandroid:name=".OtherActivity1"android:label="@string/app_name"> <intent-filter> <actionandroid:name="cn.xy.action"/> <categoryandroid:name="android.intent.category.DEFAULT"></category> </intent-filter> </activity> <activityandroid:name=".OtherActivity2"android:label="@string/app_name"> <intent-filter> <actionandroid:name="cn.xy.action2"/> <actionandroid:name="cn.xy2.action2"/> <categoryandroid:name="cn.xy.category2"></category> <categoryandroid:name="cn.xy2.category2"></category> <categoryandroid:name="android.intent.category.DEFAULT"></category> </intent-filter> </activity> <activityandroid:name=".OtherActivity3"android:label="@string/app_name"> <intent-filter> <actionandroid:name="cn.xy.action3"/> <categoryandroid:name="cn.xy.category3"></category> <dataandroid:scheme="xy"android:host="www.xy.cn"android:path="/xy"></data> <categoryandroid:name="android.intent.category.DEFAULT"></category> </intent-filter> </activity> <activityandroid:name=".OtherActivity4"android:label="@string/app_name"> <intent-filter> <actionandroid:name="cn.xy.action4"/> <categoryandroid:name="cn.xy.category4"></category> <dataandroid:scheme="xy"android:host="www.xy.cn"></data> <dataandroid:mimeType="image/*"/> <categoryandroid:name="android.intent.category.DEFAULT"></category> </intent-filter> </activity> </application> /** *隐式意图激活Activity * *@author徐越 * */ publicclassMainActivityextendsActivity { @Override publicvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } publicvoidgoActivity1(Viewv) { Intentintent=newIntent(); intent.setAction("cn.xy.action"); //方法内部默认为intent注册了android.intent.category.DEFAULT类别,所以在AndroidManifest.xml中要写上该类别 this.startActivity(intent); } publicvoidgoActivity2(Viewv) { //在只配置action和category时只要intent的action和category出现在intent-filter中就可以匹配 Intentintent=newIntent(); intent.setAction("cn.xy.action2"); intent.addCategory("cn.xy.category2"); this.startActivity(intent); } publicvoidgoActivity3(Viewv) { Intentintent=newIntent(); intent.setAction("cn.xy.action3"); intent.addCategory("cn.xy.category3"); //数据以uri形式传递 intent.setData(Uri.parse("xy://www.xy.cn/xy")); this.startActivity(intent); } publicvoidgoActivity4(Viewv) { Intentintent=newIntent(); intent.setAction("cn.xy.action4"); intent.addCategory("cn.xy.category4"); //不能分别写setData和setType,因为setType会将setData设置的值清除掉 intent.setDataAndType(Uri.parse("xy://www.xy.cn/xxx"),"image/gif"); this.startActivity(intent); } } 看一个系统intent的例子,我们在应用中比如要实现拨打电话 //v为当前被点击的按钮对象 publicvoidonClick(Viewv) { //获取电话号码 Stringphone=txtPhone.getText().toString(); //调用系统自带拨号器设置拨号意图对象 Intentintent=newIntent(); intent.setAction("android.intent.action.CALL"); intent.setData(Uri.parse("tel:"+phone)); //激活意图,方法内部会自动为Intent添加类别android.intent.category.DEFAULT startActivity(intent); } 本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1096171如需转载请自行联系原作者 woshixuye111

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

Android开发4——文件操作模式

一、基本概念 //上下文对象 privateContextcontext; publicFileService(Contextcontext) { super(); this.context=context; } //保存文件方法 publicvoidsave(Stringfilename,StringfileContent)throwsException { FileOutputStreamfos=context.openFileOutput(filename,context.MODE_PRIVATE); fos.write(fileContent.getBytes("UTF-8")); fos.close(); } 私有模式①只能被创建这个文件的当前应用访问 ②若文件不存在会创建文件;若创建的文件已存在则会覆盖掉原来的文件 Context.MODE_PRIVATE = 0; 追加模式①私有的 ②若文件不存在会创建文件;若文件存在则在文件的末尾进行追加内容 Context.MODE_APPEND = 32768; 可读模式①创建出来的文件可以被其他应用所读取 Context.MODE_WORLD_READABLE=1; 可写模式①允许其他应用对其进行写入。 Context.MODE_WORLD_WRITEABLE=2 以上文件操作模式均针对保存在手机自带存储空间的文件。若文件存储在SDCard上,则不受读写控制。 二、组合使用 FileOutputStreamoutStream=this.openFileOutput("xy.txt",Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE); 允许其他应用读写,并默认覆盖 FileOutputStreamoutStream=this.openFileOutput("xy.txt",Context.MODE_APPEND+Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE); 追加模式,但允许其他应用读写 本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1076786如需转载请自行联系原作者 woshixuye111

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

iOS开发-Xcode入门ObjC程序

元旦三天假跟妹子冷战一天半,剩下的半天觉得无聊,可以写点东西,折腾了下xCode 6.1,虽然iPhone6比较丑,但是不影响IOS在高端机上面的地位,ObjC是扩充C的面向对象编程语言。主要使用于Mac OS X和GNUStep这两个使用OpenStep标准的系统,在NeXTSTEP和OpenStep中它更是基本语言。ObjC可以在GCC以及Clang运作的系统上编写和编译,因GCC与Clang含Objective-C的编译器。1980年代初布莱德·确斯(Brad Cox)在其公司Stepstone发明Objective-C。算起来也有30多年的历史了,真正火起来还是因为IOS,成为编写苹果家族移动领域的神器。开始正题吧: OC项目 1.启动页面 2.简单的项目命令行项目,类似于vs中的控制台 3.命名项目名称 4.项目保存路径 5.项目结构,运行项目及其结果 调整字体 默认的字体很小,个人看的很不习惯,启动xCode之后,最上面xCode下有Preference,之后可以看到以下页面: 这个时候可以看到很多选项,最简单暴力一点就是全部command+a全选,全部调整一下,调整字体页面: 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4198895.html,如需转载请自行联系原作者

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

IOS开发-通知与消息机制

在多数移动应用中不论什么时候都仅仅能有一个应用程序处于活跃状态。假设其它应用此刻发生了一些用户感兴趣的那么通过通知机制就能够告诉用户此时发生的事情。 iOS中通知机制又叫消息机制,其包含两类:一类是本地通知;还有一类是推送通知,也叫远程通知。 两种通知在iOS中的表现一致,能够通过横幅或者弹出提醒两种形式告诉用户,而且点击通知能够会打开应用程序,可是实现原理却全然不同。今天就和大家一块去看一下怎样在iOS中实现这两种机制,而且在文章后面会补充通知中心的内容避免刚開始学习的人对两种概念的混淆。 通知 本地通知是由本地应用触发的。它是基于时间行为的一种通知形式,比如闹钟定时、待办事项提醒。又或者一个应用在一段时候后不使用一般会提示用户使用此应用等都是本地通知。 创建一个本地通知通常分为以下几个步骤: 创建UILocalNotification。 设置处理通知的时间fireDate。 配置通知的内容:通知主体、通知声音、图标数字等。 配置通知传递的自己定义数据參数userInfo(这一步可选)。 调用通知,能够使用scheduleLocalNotification:按计划调度一个通知,也能够使用presentLocalNotificationNow马上调用通知。 以下就以一个程序更新后用户长期没有使用的提醒为例对本地通知做一个简单的了解。 在这个过程中并没有牵扯太多的界面操作。全部的逻辑都在AppDelegate中:进入应用后假设没有注冊通知,须要首先注冊通知请求用户同意通知;一旦调用完注冊方法,不管用户是否选择同意通知此刻都会调用应用程序的 - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings 代理方法,在这种方法中依据用户的选择:假设是同意通知则会依照前面的步骤创建通知并在一定时间后运行 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5054457.html,如需转载请自行联系原作者

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

Android开发2——创建测试项目

一、创建普通Android项目 二、在AndroidManifest.xml添加两个配置 <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="cn.xy.app"android:versionCode="1"android:versionName="1.0"> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <!--引入单元测试依赖库--> <uses-libraryandroid:name="android.test.runner"/> <activityandroid:name=".MainActivity"android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> <uses-sdkandroid:minSdkVersion="8"/> <!--配置单元测试框架启动装置--> <!--android:targetPackage理解为测试项目部署在哪个Activity,而不是测试类所在包--> <instrumentationandroid:name="android.test.InstrumentationTestRunner" android:targetPackage="cn.xy.app"android:label="xy_test"/> </manifest> <uses-library android:name="android.test.runner" /> 引入测试相关类库 <instrumentation android:name="android.test.InstrumentationTestRunner"android:targetPackage="cn.xy.app" android:label="xy_test" /> 配置单元测试框架启动装置 三、编写测试代码 packagecn.xy.test; importjunit.framework.Assert; importandroid.test.AndroidTestCase; importcn.xy.service.PersonService; publicclassTestClassextendsAndroidTestCase { publicvoidtestSave()throwsException { PersonServiceps=newPersonService(); ps.save(); } publicvoidtestGetPerson()throwsException { PersonServiceps=newPersonService(); Stringname=ps.getPersonName(); Assert.assertEquals("xy",name); } } 测试类要继承AndroidTestCase类,测试方法要以test开头。 注意到该测试类放在cn.xy.test包下,而不是cn.xy.app下,并不影响,印证了android:targetPackage理解为测试项目部署在哪个Activity,而不是测试类所在包。 四、运行 直接将鼠标放在方法上邮寄Run AS——>Android Junit Test,会被部署到手机上作为一个Activity运行,方法运行的结果仍然以红条或者绿条显示,很以前纯Junit一样。 五、总结 这是一种方式,还可以直接建立Android Test Project。 本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1075462如需转载请自行联系原作者 woshixuye111

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

实战:Android活动目录LiveFolder开发

活动目录(LiveFolder)是一种小型的应用层插件。它本身体现为桌面出现的图标,通过点击这些图标,将出现一个列表框,列表框中将显示数据信息。通过活动目录可以在不打开应用程序的情况下,在桌面就能查看其中的数据信息。 在Android的桌面中长按桌面或者选择菜单,进入增加活动目录的界面,可以将LiveFolder增加到桌面,LiveFolder的增加界面和运行效果如图8-4所示。 图8-4中左图为增加LiveFolder的界面,列表中的内容由各个应用程序实现的增加LiveFolder的入口决定。LiveFolder点击后不会启动Activity,而是在出现类似图8-4中右图的界面的对话框。这个对话框不是LiveFolder实现者的一部分,而是桌面程序提供的功能。对话框通常包含一个列表,LiveFolder实现者可以实现其中的每个项目显示的内容,还可以进一步实现每个内容被点击之后,出现的界面。如果仅仅出现活动目录列表项对话框,实际是LiveFolder实现者并没有提供运行的界面,而只是在桌面查看了其中的内容。 ▲图8-4 活动目录增加界面和运行效果(左:增加界面;中:Contacts活动目录; 右:Contacts活动目录的点击效果) LiveFolder的程序组成 LiveFolder插件的本质是一个特殊的Activity和一个特殊的ContentProvider。Activity需要支持特殊的Intent动作,负责创建LiveFolder,并通过URI关联到某个ContentProvider;ContentProvider负责提供LiveFolder中使用的各个项目的内容。 android.provider包的LiveFolders类定义活动目录的Activity和ContentProvider中的特殊内容。 1.LiveFolder的Activity 在Activity方面,LiveFolders类中的ACTION_CREATE_LIVE_FOLDER动作,实际表示的字符串为“android.intent.action.CREATE_LIVE_FOLDER”。接受这个Intent-filter的Activity,将被桌面程序选择作为可以创建LiveFolder的程序。 Activity在收到ACTION_CREATE_LIVE_FOLDER动作的Intent启动后,要通过setResult()调用的方式把活动目录的内容发回给它的调用者。返回的Intent的核心内容是需要设置一个Uri,表示活动目录要查询的ContentProvider的地址。 LiveFolders类中的另外几个数值表示创建LiveFolder后返回的附加参数。 EXTRA_LIVE_FOLDER_NAME:表示所建立的活动目录的名称(也就是出现在桌面的标签),为字符串“android.intent.extra.livefolder.NAME”,类型为String。 EXTRA_LIVE_FOLDER_ICON:表示活动目录在桌面显示的图标,为字符串“android.intent.extra.livefolder.ICON”,类型为Intent.ShortcutIconResource(作为Parcelable传递)。 EXTRA_LIVE_FOLDER_DISPLAY_MODE:表示活动目录的显示模式,为字符串“android.intent.extra.livefolder.DISPLAY_MODE”,类型为int ,具有两个数值可以使用:DISPLAY_MODE_GRID(网格)和DISPLAY_MODE_LIST(列表)。 EXTRA_LIVE_INTENT:表示活动目录中某个项目被点击后,启动内容的Intent,为字符串“android.intent.extra.livefolder.BASE_INTENT”,类型为Intent。 综合以上几个方面,LiveFolders被创建后,返回的Intent比较特殊,这个Intent实际上用于指向一个内容提供者,其中的Data域就是指向这个内容提供者的URI。它的额外参数定义了体现在桌面上的名称和图标,也体现了点击桌面图标后出现的对话框中的内容。 LiveFolder增加到桌面后的图标和选择LiveFolder的图标可以不同。在习惯上,为了区别桌面的Shotcut,LiveFolder的图标通常做成类似文件夹的形式。 2.LiveFolder的ContentProvider 在ContentProvider方面,需要在查询(query())的时候,支持几个特殊的域。这些域由LiveFolders类的几个常量定义,如下所示。 NAME:表示每个项目的名称,为字符串“name”,类型为String; DESCRIPTION:表示每个项目的描述,为字符串“description”,类型为String; INTENT:表示每个项目被选中后启动的内容,为字符串“intent”,类型为Intent; ICON_BITMAP:表示每个项目的图标,为字符串“icon_bitmap”,类型为Bitmap; ICON_PACKAGE:表示项目图标对应的应用程序包的名字,为字符串“icon_ package”,类型为String; ICON_RESOURCE:表示项目图标对应的资源名称,为字符串“icon_resource”,类型为Parcelable。 对于LiveFolder的ContentProvider的实现,以上的几个域只有NAME必须实现,其他是可选的。 LiveFolders实现了BaseColumns接口,因此其中也含有两个静态属性。 _ID:内容的id,为字符串“_count”,类型为INTEGER; _COUNT:内容的数目,为字符串“_id”,类型为INTEGER。 实现LiveFolder的ContentProvider也需要支持_ID和_COUNT两个域。 LiveFolder的实现 本节中的LiveFolder Sample程序实现了一个活动目录,增加后将在桌面出现一个图标。点击这个活动目录在桌面的图标,将在LiveFolder的列表框中显示一些内容。LiveFolder Sample的执行效果如图8-5所示。 图8-5中右图的列表项对话框共有8个项目,进一步点击每一个项目,还将出现浏览器显示空(blank)的网页。 LiveFolder Sample实现的AndroidMenifest.xml中定义的一个用于创建LiveFolder 的Activity和一个显示内容的ContentProvider,如下所示: <activity android:name="LiveFolderSample" android:icon="@drawable/app_icon" android:label="LiveFolder Sample"> <intent-filter> <action android:name="android.intent.action.CREATE_LIVE_FOLDER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <provider android:name="LiveFolderSampleProvider" android:authorities="livefoldersample"/> ▲图8-5 LiveFolder Sample(左:增加界面;中:LiveFolder的桌面图标;右:启动对话框) 这里声明的Activity支持“android.intent.action.CREATE_LIVE_FOLDER”动作,表示可以用它来创建活动目录,也就是可能在活动目录的增加列表中出现它这个项目。 public class LiveFolderSample extends Activity { private static final String URI = // ContentProvider的URI "content://" + "livefoldersample" + "/live_folders/virtual"; private static final Uri CONTENT_URI = Uri.parse(URI); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Intent intent = getIntent(); // 获得其中的Intent final String action = intent.getAction(); if (LiveFolders.ACTION_CREATE_LIVE_FOLDER.equals(action)) { final Intent liveFolderIntent = new Intent(); // 返回结果中的Intent final Intent urlIntent = new Intent(Intent.ACTION_VIEW,Uri.parse("about://blank")); returnIntent.setData(CONTENT_URI); // Intent中的URI returnIntent.putExtra( // LiveFolder对话框的名称 LiveFolders.EXTRA_LIVE_FOLDER_NAME,"LiveFolderSample"); returnIntent.putExtra( // LiveFolder的图标 LiveFolders.EXTRA_LIVE_FOLDER_ICON,Intent.ShortcutIconResource. fromContext(this,R.drawable.app_icon)); returnIntent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE, LiveFolders.DISPLAY_MODE_LIST); returnIntent.putExtra( // LiveFolder中的每个内容Intent LiveFolders.EXTRA_LIVE_FOLDER_BASE_INTENT,urlIntent); setResult(RESULT_OK, returnIntent); // 设置返回结果 } else { setResult(RESULT_CANCELED); } finish(); } } 在创建LiveFolder的过程中,涉及两个Intent。returnIntent是Activity返回的效果,在其中通过额外参数指定图标和活动目录的名称,其中主要的内容是指向ContentProvider的URI,并定义了其中的图标和名称。 返回内容returnIntent的一个特殊的域为urlIntent,也是一个Intent,它表示每一个项目被点击之后启动Activity的Intent。在这里将它定义为Intent.ACTION_VIEW 动作和以“about://blank”表示的Intent。当点击LiveFolder中的每一个项目的时候,将调用相应的程序(实际上是浏览器),对应的URI为“about://blank”再附加上每个内容的id。 这里的ContentProvider的实现内容如下所示: public class LiveFolderSampleProvider extends ContentProvider { private static final int VIRTUAL = 1; // 各个项目的id private static final int VIRTUAL_ID = 2; private static final int LIVE_FOLDER_SAMPLE = 3; public static final String AUTHORITY = "livefoldersample"; // URI private static final UriMatcher sUriMatcher; static { sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); // 建立匹配器 sUriMatcher.addURI(AUTHORITY, "virtual/", VIRTUAL); sUriMatcher.addURI(AUTHORITY, "virtual/#", VIRTUAL_ID); sUriMatcher.addURI(AUTHORITY, "live_folders/virtual", LIVE_FOLDER_SAMPLE); } // ...... 省略部分内容:query()方法的实现 @Override public String getType(Uri uri) { // 获取类型的实现 switch (sUriMatcher.match(uri)) { case VIRTUAL: case VIRTUAL_ID: return ""; case LIVE_FOLDER_SAMPLE: return ""; default: throw new IllegalArgumentException("Unknown URI " + uri); } } @Override public boolean onCreate() { return true; } @Override public Uri insert(Uri uri, ContentValues initialValues) { return null; // LiveFolder不要求实现insert() } @Override public int delete(Uri uri, String where, String[] whereArgs) { return 0; // LiveFolder不要求实现delete() } @Override public int update(Uri uri, ContentValues values, String where, String[] whereClause) { return 0; // LiveFolder不要求实现update() } } 对于为LiveFolder使用的ContentProvider,需要实现getType()方法,而其他方法不是必需的,如果要实现,可以在其他的地方对ContentProvider进行操作。 query()方法的实现是主要的内容,如下所示: @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder) { switch (sUriMatcher.match(uri)) { // 查询操作的匹配 case VIRTUAL: // 不返回实际内容 case VIRTUAL_ID: return null; case LIVE_FOLDER_SAMPLE: return getLivefolder(); // 调用返回内容 default: throw new IllegalArgumentException("Unknown URI " + uri); } } private Cursor getLivefolder() { // 返回具体的内容 int i = 0; String[] columnNames = {LiveFolders._ID,LiveFolders.NAME}; // 2个必要的列 String[] temp = {"",""}; MatrixCursor c = new MatrixCursor(columnNames); for(i = 0 ;i < 8;i++){ // 循环返回8个项目 temp[0] = String.valueOf(i); // _ID的内容 temp[1] = LiveFolders.NAME + " = " + String.valueOf(i); // NAME的内容 c.addRow(temp); } return c; } 在查询返回的时候,实际上只有一个项有效,联系ContentProvider和LiveFolder创建者的是名称为“content://livefoldersample/live_folders/virtual”的URI。 查询返回具有两列的内容,其中第一列为_ID,第二列为NAME。前者表示每列的id,这是必须具有的,后者也就是反映在LiveFolder对话框中的每个项目显示的内容。 由于在这里没有为每个项目设置Intent域(LiveFolders.INTENT),因此每个项目在被选择之后将根据LiveFolder的创建者中设置的Intent附加上每个项目的id,作为启动的内容。例如,点击第2个项目将打开名称为“about://blank/1”的地址的空网页。 本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/796642,如需转载请自行联系原作者

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

Android开发学习笔记:浅谈WebView

WebView(网络视图)能加载显示网页,可以将其视为一个浏览器。它使用了WebKit渲染引擎加载显示网页,实现WebView有以下两种不同的方法: 第一种方法的步骤: 1.在要Activity中实例化WebView组件:WebView webView = new WebView(this); 2.调用WebView的loadUrl()方法,设置WevView要显示的网页: 互联网用:webView.loadUrl("http://www.google.com"); 本地文件用:webView.loadUrl("file:///android_asset/XX.html");本地文件存放在:assets文件中 3.调用Activity的setContentView()方法来显示网页视图 4.用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面 5.需要在AndroidManifest.xml文件中添加权限,否则会出现Web page not available错误。<uses-permissionandroid:name="android.permission.INTERNET"/> 下面是具体例子: MainActivity.java packagecom.android.webview.activity; importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.KeyEvent; importandroid.webkit.WebView; publicclassMainActivityextendsActivity{ privateWebViewwebview; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); //实例化WebView对象 webview=newWebView(this); //设置WebView属性,能够执行Javascript脚本 webview.getSettings().setJavaScriptEnabled(true); //加载需要显示的网页 webview.loadUrl("http://www.51cto.com/"); //设置Web视图 setContentView(webview); } @Override //设置回退 //覆盖Activity类的onKeyDown(intkeyCoder,KeyEventevent)方法 publicbooleanonKeyDown(intkeyCode,KeyEventevent){ if((keyCode==KeyEvent.KEYCODE_BACK)&&webview.canGoBack()){ webview.goBack();//goBack()表示返回WebView的上一页面 returntrue; } returnfalse; } 在AndroidManifest.xml文件中的17行添加权限 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.webview.activity" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.INTERNET"/> </manifest> 效果图: 第二种方法的步骤: 1、在布局文件中声明WebView 2、在Activity中实例化WebView 3、调用WebView的loadUrl( )方法,设置WevView要显示的网页 4、为了让WebView能够响应超链接功能,调用setWebViewClient( )方法,设置 WebView视图 5、用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面 6、需要在AndroidManifest.xml文件中添加权限,否则出现Web page not available错误。 <uses-permission android:name="android.permission.INTERNET"/> 下面是具体的例子: MainActivity.java packagecom.android.webview.activity; importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.KeyEvent; importandroid.webkit.WebView; importandroid.webkit.WebViewClient; publicclassMainActivityextendsActivity{ privateWebViewwebview; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); webview=(WebView)findViewById(R.id.webview); //设置WebView属性,能够执行Javascript脚本 webview.getSettings().setJavaScriptEnabled(true); //加载需要显示的网页 webview.loadUrl("http://www.51cto.com/"); //设置Web视图 webview.setWebViewClient(newHelloWebViewClient()); } @Override //设置回退 //覆盖Activity类的onKeyDown(intkeyCoder,KeyEventevent)方法 publicbooleanonKeyDown(intkeyCode,KeyEventevent){ if((keyCode==KeyEvent.KEYCODE_BACK)&&webview.canGoBack()){ webview.goBack();//goBack()表示返回WebView的上一页面 returntrue; } returnfalse; } //Web视图 privateclassHelloWebViewClientextendsWebViewClient{ @Override publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){ view.loadUrl(url); returntrue; } } } main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <WebView android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> 在AndroidManifest.xml文件中的17行添加权限 <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.android.webview.activity" android:versionCode="1" android:versionName="1.0"> <uses-sdkandroid:minSdkVersion="10"/> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> <uses-permissionandroid:name="android.permission.INTERNET"/> </manifest> 效果图: 本文转自 lingdududu 51CTO博客,原文链接:http://blog.51cto.com/liangruijun/647456

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册