‘壹’ 如何开发一个简单的 android Wear 应用程序
你可以选择Eclipse或AndroidStudio作为AndroidWear的集成开发环境(IDE)。谷歌建议用AndroidStudio进行开发。通过Android的SDK管理者下载API20(4.4KitKatWear):AndroidStudio提供了在现有应用程序中添加AndroidWear支持或创建新项目的便捷方式:AndroidStudio用的是组件模型,其中手机和AndroidWear是单项目的一部分。如果要在AndroidStudio创建一个新项目,点击文件->新项目。在向导的第二页,选择构成因子,确保选择AndroidWear模块作为你开发的构成因子(见下图)。一旦完成所有选项选择,项目就会自动生成。你会看到这个Android项目有两个模块:移动和Wear。移动的使用于手机的应用程序,Wear是在AndroidWear上运行的程序。Wear应用程序不可以作为单独的软件包放在谷歌商店里。你需要把移动和Wear应用程序放在同一个应用程序APK中。当用户在手机上下载APK时,Wear应用程序就会自动传到配对的Wear设备。AndroidStudio产生的默认项目并没有什么特别。在测试期间,我们需要自己写代码,这取决于我们想要应用程序的“可穿戴“执行什么。通知AndroidWear的开发可以从两个角度进行分析:通知和AndroidWear应用程序本身(包括在APK文件夹)。对于已经从谷歌商店安装官方AndroidWear到手机的用户,以及已经把手机和Wear设备配对的用户,不需要在应用程序中对通知进行任何更改。虽然这样说,但为了让Wear真正发挥作用,有时候更改是有必要的。你可以令通知只出现在手机或可穿戴设备或两者都有。此外,如上所述,开发商应该想下如何利用用户界面(UI)优势——即背景图像、通知标题、文本等等。创建将发送到可穿戴设备的手持式通知,谷歌建议使用通知兼容生成器。Android的支持库提供了一系列类别,你需要添加到你的项目中。如果使用AndroidStudio,你需要添加下列属于移动模块中的build.gradle文件的编译时间。compile"com.android.support:support-v4:20.0.+"要创建通知,你可在你的移动应用程序中尝试下面的代码:NotificationCompat.Builderbuilder=newNotificationCompat.Builder(this);builder.setContentTitle(“NewAPI”).setContentText(“XYZAPIgotaddedtoFoodCategory”).setSmallIcon(R.drawable.ic_mynotification).setContentIntent(PhoneActivityPendingIntent);然后,你可以根据你的逻辑触发通知,如下所示:=NotificationManagerCompat.from(this);notificationManager.notify(notificationId,notificationBuilder.build());现在,当用户在Wear设备上收到通知时,他们在手机上点击通知或者滑动到左边就可以启动等待模式,然后显示开始动作。作为扩展部分,如果想要通知只出现在手机,你可以通过具体说明setLocalOnly来创建通知。在上面的例子中,我们只显示了一个卡片,但你可以看下有多页甚至折叠的通知卡片。可穿戴应用程序虽然AndroidWear支持来自手机的通知,但有时候还不够。有几种情况,包括:在手机上收到数据时想要在Wear设备启动活动;从Wear设备向手机发送信息,反过来执行一些活动或者在后台做点什么;在Wear设备上创建自定义界面;编写一个可以在Wear设备上启动和运行的程序,并且可以通过接收语音输入启动不同动作指令。以上提到的都有可能实现,前提是你了解一些WearAPI的基础知识。连接和数据交换前面提供的案例中,共同的主题是手机和Wear设备都需要一个可连续双方的机制,然后一旦建立联系,就需要相互的信息交换。这反过来可以触发相应设备上的正确指令。手机和可穿戴设备之间的联系是由谷歌提供服务的。谷歌API客户端提供了这种联系的实例。执行实例为了了解全局,我们来看一个实例应用程序,包括手机和Wear组件。为了让事情简单化,手机应用程序将会有单独的活动指令名称——MainActivity.java。它设计了一个按钮,点击时会发送消息到Wear应用程序。首先,让我们看下MainActivity.java在手机应用程序上的情况(主要方法如下所示):同样,用户只要向Wear设备说出“开始【活动名称】”就可以开始一个活动指令。你所需要做的就是在活动清单中为该活动提供一个文件属性
‘贰’ 用Android studio做一个可以运行的小程序,闹钟也行,然后可以连到手机,感谢大神。
环境搭建就不讲了,直接说开发。
小闹钟程序开发中的要点就是:
1、时间选择对话框(TimePicker)
2、获取闹钟管理器并对其进行设置
3、注册广播接收器
掌握了这两点,写程序就很简单了。
1、新建android项目:Alarm,sdk版本选择2.2,Package name:com.lql.activity,Main Activity:Alarm
2、编写界面:直接修改layout中的main.xml文件,代码如下:
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"
android:gravity="center_vertical"
>
<Button
android:id="@+id/timeBtn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/time"
android:textSize="20sp"
/>
<Button
android:id="@+id/cancelAlarmBtn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/cancelAlarm"
/>
</LinearLayout>
界面的效果如下:
{
/*(non-Javadoc)
*@seeandroid.content.BroadcastReceiver#onReceive(android.content.Context,android.content.Intent)
*/
@Override
publicvoidonReceive(Contextarg0,Intentdata){
Log.d(Alarm.TAG,"thetimeisup,startthealarm...");
Toast.makeText(arg0,"闹钟时间到了!",Toast.LENGTH_SHORT).show();
}
}
这个代码就很简单了,主要是要继 承BroadcastReceiver 这个类,然后重写onRecive方法。onRecive方法在闹钟的时间达到之后会执行,在这里我们可以做自己的事情,比如启动某个程序,或者播放铃声,我这里就是简单的提示一下,使用的是Toast。
5、在android的AndroidManifest.xml文件中注册广播接收器:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
Xml代码
package="com.ql.activity"
android:versionCode="1"
android:versionName="1.0">
<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
<receiverandroid:name=".AlarmReceiver"android:process=":remote"/>
<activityandroid:name=".Alarm"
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"/>
</manifest>
核心的配置为<receiver android:name=".AlarmReceiver" android:process=":remote" />,这也是闹钟程序的关键,如果不做这个配置,那么时间到了之后,闹钟将不会提示。
接下来就是到模拟器上测试,运行截图如上图。程序源代码见附件。
‘叁’ 如何在Android中实现一个简单连接网络的应用程序
注意:要执行这节课中描述的网络操作,你应用程序的manifest文件中必须包含以下权限:1 2<uses-permissionandroid:name="android.permission.INTERNET"/><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>选择一个HTTP客户端 Choose an HTTP Client大多数网络连接的Android应用使用HTTP发送和接受数据,Android包括两个HTTP客户端:HttpURLConnection和Apache HttpClient,它们支持HTTPS,流上传和下载,
可配置的超时,IPv6以及连接池,在android系统版本为“姜饼”(android2.3)或者更高版本的应用程序中,推荐使用HttpURLConnection,更多关于这个主题的讨论,请查看博客Android HTTP 客户端检查网络连接 Check the Network Connection在你的应用试图连接到网络时,应该先检查网络连接是否可用,可以用getActiveNetworkInfo()和isConnected()方法执行检查。记住,设备(手机等设备)可能不在网络连接的范围内,或者用户禁用了Wi-Fi或者移动数据通道。更多关于此主题的讨论,请参看课程管理网络使用
1 2 3 4 5 6 7 8 9 10 11 12publicvoidmyClickHandler(Viewview){...ConnectivityManagerconnMgr=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfonetworkInfo=connMgr.getActiveNetworkInfo();if(networkInfo!=null&&networkInfo.isConnected()){// 获取数据}else{// 显示错误}...}在独立线程中执行网络连接 Perform Network Operations on a Separate Thread网络操作涉及不可预知的延迟,为了防止不良的用户体验,通常的做法是从UI中独立出线程去执行网络连接操作。AsyncTask类提供了最简单的从UI线程中独立出一个新任务的方式。
更多关于此主题的讨论,请参看博客多线程性能在下面的代码片段中,myClickHandler()方法执行了new DownloadWebpageTask().execute(stringUrl).DownloadWebpageTask类是AsyncTask的子类,DownloadWebpageTask实现了下面AsyncTask的方法:
doInbackground()会执行downloadUrl()方法,downlaodUrl()方法将网页的URL地址作为参数,并获取和处理网页的内容,当它处理完这些操作,将会返回一个结果字符串。
onPostExecute()接受返回字符串并显示在UI上。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 {privatestaticfinalStringDEBUG_TAG="HttpExample";privateEditTexturlText;privateTextViewtextView;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);urlText=(EditText)findViewById(R.id.myUrl);textView=(TextView)findViewById(R.id.myText);}// 当用户点击按钮,调用AsyncTask// 在试图获取URL时,确保有一个网络连接publicvoidmyClickHandler(Viewview){// 从UI的text字段中得到URLStringstringUrl=urlText.getText().toString();ConnectivityManagerconnMgr=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfonetworkInfo=connMgr.getActiveNetworkInfo();if(networkInfo!=null&&networkInfo.isConnected()){newDownloadWebpageText().execute(stringUrl);}else{textView.setText("No network connection available.");}}// 使用AsyncTask创建一个独立于主UI线程之外的任务. 并使用URL字符串创建一个HttpUrlConnection对象。 // 一旦连接建立,AsyncTask则将网页内容作为一个InputStream对象进行下载。// 最终,InputStream对象会被转换为一个字符串对象,并被AsyncTask的onPostExecute方法显示在UI上。{@(String...urls){// 参数来自execute(),调用params[0]得到URLtry{returndownloadUrl(urls[0]);}catch(IOExceptione){return"无法获取网页,URL可能无效!Unable to retrieve web page. URL may be invalid.";}}// onPostExecute显示AsyncTask结果.@(Stringresult){textView.setText(result);}}...}该片段事件顺序如下:1.当用户点击执行myClickHander()方法的按钮时,应用会将指定的URL传递给AsyncTask的子类DownloadWebpageTask。2.AsyncTask的方法doInBackground()调用downloadUrl()。3.downloadUrl()接收到作为字符串参数传递过来的URL,并用它创建一个URL对象。4.使用URL对象创建HttpURLConnection对象。5.一旦创建完HttpURLConnection对象,该对象将会以InputStream对象方式获取网页内容。6.InputStream再通过readIt()方法将流转换为字符。7.最后,AsyncTask的onPostExecute方法将字符显示在主activity的UI。连接并下载数据 Connect and Download Data在你执行网络事务的线程中,你可以使用HttpURLConnection执行GET方法下载数据,在你调用了connect()方法后,你可以通过调用getInputStream()方法得到数据的InputStream对象。
在下面的代码片段中,doInBackground()方法调用了downloadUrl()方法。downloadUrl方法接收给过来的URL,并使用它通过HttpURLConnection对象连接到网络。一旦连接成功,应用将使用getInputStream()方法获得InputStream对象数据。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31// 给一个URL,建立HttpUrlConnection对象并作为流对象(InputStream)获取网页数据,最后返回一个字符串。privateStringdownloadUrl(Stringmyurl)throwsIOException{InputStreamis=null;// 先显示获取到的前500个字节// 网页内容intlen=500;try{URLurl=newURL(myurl);HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setReadTimeout(10000/*milliseconds*/);conn.setConnectTimeout(15000/*milliseconds*/);conn.setRequestMethod("GET");conn.setDoInput(true);// 开始查询conn.connect();intresponse=conn.getResponseCode();Log.d(DEBUG_TAG,"The response is: "+response);is=conn.getInputStream();// 将InputStream转化为stringStringcontentAsString=readIt(is,len);returncontentAsString;// 确保当app用完InputStream对象后关闭它。}finally{if(is!=null){is.close();}}}注意:getResponseCode()方法返回的是连接状态码,它是获取更多关于连接信息的有效方式。状态码200表示连接成功。