Android 学习笔记(一)

 在Android里,应用程序是通过清单目录定义的。每个应用程序都是定义在AndroidManifest.xml里,其声明了其进入点(Entry Point)、通讯层(Communication Layer)、授权(Permission),以及活动(Activity)和意图(Intent)等。其中,有4个基础组件,我们称之为Android的主要组件,他们组成了丰富的Android应用程序。

Activity: Android 应用程序的UI(User Interface)基本组件。

Intent receiver: 可随时被启动来处理Intent,并执行其任务。

Service: 非UI功能的后台处理组件。

Content provider: 跨程序的共享资料之存储者。

 

Android vs. Java ME vs. BREW

一个BREW应用程序,在所有绝大多数情况下,是由一个单独的小程序组成,这个小程序是通过接收和发送活动与手机的其他部分通信的。另一方面,你可以将一个Java ME应用看做Midlet类的扩展。这个Midlet有启动、停止、暂停、键处理(key handling)的功能,并且可以完成任何手机和应用的交互。一个Java ME应用程序通常由一个单独的Midlet组成。

 

Android应用程序有许多活动,通过AndroidManifest.xml文件,这些活动可以被注册在手机中。 在面向Android的开发与面向其他手机开发工具包的开发之间,Android的multiactivity架构或许是的他们之间主要的区别。正是这个事实使编写模块化、分割的代码(modular, compartmentalized code)更容易。在BREW和Java ME中,开发人员可以执行在Midlet或小程序范围内的大部分功能。在Android中,你可以写一个活动、内容处理程序(content handler)、意图接收器(intent receiver)、或服务以应对几乎任何东西。一旦你编写了编辑文本文件的活动,通过发送和接收意向的行动,您可以引用这个活动在您将来所有编写的应用中。这个这并不是说,这种架构在BREW或Java ME中是不能实现的,他们只是必须在Java和C或C++编程的基础上,或在BREW中通过繁琐的扩展实现,而不是被平滑地集成到应用框架中。


Functionality

就像Midlet,活动使用了一系列的功能与外面的世界进行交换。在他的基础上,你编写的活动必须重写方法OnCreate,你还要重写其他功能,包括:onStop、onPause、onResume和onKeyDown。这几个功能可以让最大限度地将你开发的活动绑定到Android手机中。在默认情况下,在Eclipse中创建新的Android应用程序将执行一个“Hello,World”应用程序。我会告诉你如何从这个基本应用到功能齐全的画面。

 

如何添加图片(Image)资源

首先将图片资源(例如menu_background.jpg)直接拷贝到/res/drawable文件夹中。此时,Eclipse的Android插件(Android Plug-In)会自动将一个新的ID值添加到R.java里。所以R.java文档中会多加了一行指令如下:

public static final int menu_background=0x7f020001;

在应用程序将就用此ID值来取得这个图标文件,并显示或处理它。

 

如何定义XML布局 (Layout) 文件

刚才已经新增了一个图片资源文件。此时,在定义布局XML文件中,就可以引用此图片。这些布局XML文件都放在在/res/layout文件夹中,其中Eclipse的Android插件已经生成了一个main.xml文件。现在,你可利用Eclipse的 File>New>File菜单选项来生成新布局XML文件,例如:splash.xml。然后,以main.xml內容为模板,将之拷贝到新的splash.xml里,下一步移动<TextView>并且增加<ImageView>,内容如下:

<ImageView android:src="@drawable/menu_background"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</ImageView>

在Android的XML布局文件里,使用@drawable/就能轻松地引用/res文件夹中的资源,例如上面的的android:src="@drawable/menu_background"。此外,layout_width和layout_height 则说明这个ImageButton显示出來的大小(Size)。splash.xml也成為一項新的資源。所以在R.java裡也會自動產 生新的一行,如下:

public static final int splash=0x7f030001;

绘制启动画面

 

现在,你的初始画面被定义完成,可以激活和显示。你现有的Android活动已制定了main.xml,所以你要转移到新的初始布局。为了切换,更改OnCreate方法中的代码:

setContentView(R.layout.main);

setContentView(R.layout.splash);

运行应用程序,看着你新创建的启动画面。到目前为止,如果你得到了错误信息,检查以确认你的名字是否匹配。如果图片没有显示,确保它被正确地放置在res/rawable文件夹,并splash.xml应用了正确的名称和文件。

   

时间可以解决任何问题

 

启动屏幕开始展现,但启动画面单独作无聊的应用程序,所以你需要进入主菜单。你会使用简单的内嵌定义线程来完成的定时器,有一些常数需要在定义线程前初始化。为了看上去完整,我将包括全部的OnCreate方法。代码如下。

Code Listing 2-1. Timing the Splash Screen

long m_dwSplashTime = 3000;

boolean m_bPaused = false ;

boolean m_bSplashActive = true ;

public void onCreate(Bundle icicle)

{

super .onCreate(icicle);

//Draw the splash screen

setContentView(R.layout.splash);

//Very simple timer thread

Thread splashTimer = new Thread()

{

public void run()

{

try

{

//Wait loop

long ms = 0;

while (m_bSplashActive && ms < m_dwSplashTime)

{

sleep(100);

//Advance the timer only if we're running.

if (!m_bPaused)

ms += 100;

}

//Advance to the next screen.

startActivity(new Intent(

"com.google.app.splashy.CLEARSPLASH"));

}

catch (Exception e)

{

Log.e("Splash", e.toString());

}

finally

{

finish();

}

}

};

splashTimer.start();

}

  

到现在 你才开始看到一些 Java 代码。这个简单的线程直到运行时间计数器超过 m_dwSplashTime 才停止。虽然有实现一个计时器多种方式,选择这种方式有两个原因:

  • 此计数器可以暂停。该计时器只有m_bPaused标志为false时才推动。正如你将看到在一分钟内,如果你调用活动的OnPause方法,可以方便暂停计时器。这并不总是对启动画面的需求,这对其他以时间为基础的业务是重要的。

 

  • 移动到下一个屏幕很简单,只要改变的m_bSplashActive标记为false。推进到下一个屏幕,如果你执行这在时尚,不要求你作出的行动,然后取消更传统的计时器。

 

有了这个代码,只要你以毫秒为单位设置m_dwSplashTime,你应该看到启动画面。当时间到了或用户使用按键中断了启动画面,startActivity将被调用。finish可以关闭启动活动,使用户不必通过从主菜单上选择Back返回。你需要执行一项活动,接受CLEARSPLASH意图的行动。与此同时,让我们回顾一些其他重要活动的方法你需要重写。

 

暂停,恢复,冲洗,重复

由于呼入电话,短信或其他中断,你的活动被挂起时,暂停启动计时器,如下:

protected void onPause()

{

super.onPause();

m_bPaused = true;

}

对于这些大部分覆盖的方法 在做任何事情之前 你需要调用超类。如果你查看计时器线程,如果m_bPaused是true,你会看到负责跟踪时间的MS计数器保持时间没有前进。在这一点上,我相信你可以猜测onResume的样子:

protected void onResume()

{

super.onResume();

m_bPaused = false;

}

当你的应用程序恢复,计时器线程添加时间恢复到MS计数器。

 

基础的 Key Handling

在活动内,Key Handling是处理覆盖onKeyDown方法。我们将使用此功能允许用户取消你不完美的启动画面。正如在本节开始你看到的计时器线程,通过m_bSplashActive设置,你在计时器循环中了异常语句。为了异常处理,你只需要重写onKeyDown方法使之切换启动标记为false。下面的代码需要添加:

public boolean onKeyDown(int keyCode, KeyEvent event)

{

//if we get any key, clear the splash screen

super .onKeyDown(keyCode, event);

m_bSplashActive = false ;

return true;

}

现在 当用户按下任意键 屏幕将被推进到下一个路程通过计时器循环。

 

Clear intent

有一件事你需要在启动画面之前做 我相信你想知道有关 startActivity 方法调用。这里应该简单介绍一下intent。Intent是一个对象,在两个或两个以上活动、内容处理(content handlers)、意图接收器(intent receiver)、或服务之间,可以作为一个通讯事件。你会使用com.google.app.splashy.CLEARSPLASH调用 startActivity 。当startActivity被调用时,Android搜索所有配置清单文件,寻找已注册为CLEARSPLASH Intent action节点。

你要增加一个新类MainMenu,其作为主菜单activity。它要继承Activity类,实现OnCreate方法,在R.layout.main中调用setContentView方法。你要打开的AndroidManifest.xml并增加新的 activity 元素。在 </activity> 结束符之后, 你应该插入以下内容:

<activity android:name=".MainMenu"

android:label="@string/app_name">

<intent-filter>

<action android:name=

"com.google.app.splashy.CLEARSPLASH"/>

<category android:name=

"android.intent.category.DEFAULT"/>

</intent-filter>

</activity>

确定活动的名称为 .MainMenu 。这会告诉 Android 加载和运行 Java 类。在 Intent filer 标签中 注册为 com.apress.splash.CLEARSPLASH Intent Action 。在现实中,名称意图可能是beef.funkporium.swizzle,只要名称在startActivity调用和前面的Android配置清单中一致,所有正确的事情应继续发生。

 

一项活动的生命周期

Activity的生命周期被包括在Google的文档中。但是,如果你先仔细考虑生产Activity的底层原理,你不能错过这个重要的信息。在这一点,你的启动画面,你应该准备好推出。

为了说明,我还增加了以功能在启动画面活动中:

protected void onStop()

{

super.onStop();

}

protected void onDestroy()

{

super.onDestroy();

}

如果你方断点在上面活动的所有功能,在调试模式下运行它,你会看到断点与下面顺序一致:

1. onCreate

2. onStart

3. onResume

4. 在这一点上,你的活动目前已经运行。在三秒钟内,计时器线程将达到结束,并调用startActivity结算的意图。下一步,它将调用finish,它告诉Android关闭启动画面活动。

5. onPause

6. onStop

7. onDestroy

5. onPause

6. onStop

7. onDestroy

从开始到结束 Activity 这是一般的生命周期来。你可以找到对生命和时代的 Android 活动更全面地披露 在谷歌的文档活动中 http://code.google.com/android/reference/android/app/ Activity.html 。你甚至可以找到漂亮图形。从本质上讲,手机使用了以前的组合功能提醒你的主要事件可以发生在你的应用程序:启动,关闭,暂停和恢复。我已经讨论过,Activity将要成为任何传统应用的的核心组件;他们给你控制了屏幕,能够接收用户输入。

 

总结

到目前为止,我已经探讨了活动如何成在手机中,他们如何启动和停止,以及他们如何与基础层沟通。我演示了如何显示一个简单的XML视图屏幕,以及如何活性之间切换两个反应都在一个关键的事件和结束时的一个指定的时间量。在短期内,你需要了解更多有Android如何使用意向,意图接收器,过滤器和意图沟通。要做到这一点,你需要一个示例应用程序。

 

创建一个Intent Receiver

Intent Receiver是Android重要的组成部分,从它的名字可以看出其作用。它的作用是等待接收注册的Intent Action,Android是按照BREW的通知模式实现的。我们将使用一个简单的应用,展现一个复杂的Intent Receiver任务:输入文本消息的接收和响应。

 

事情的起因

我们开始设想这样一幅画面:一天下午,当你回到你的办公桌,你发现你的办公桌,从地毯到天花板与可爱的粉红色的图片,铺满最令人讨厌的图画。你知道这是谁在做,现在是你报复的时候了。你也知道你的工程部副总裁最厌恶一首特殊的歌。这首歌是 La Bamba 。让你决定通过一个休眠程序操纵你同事的Android手机。我会告诉你如何制作一个Android应用程序,收到特定的短信后,播放这种耻辱效应的音频文件。这会使你的副总对你的新敌人产生强烈的愤慨。同时,你要给他一个机会关闭声音了。这种恶作剧程序要求Intent Receiver,Activity,Service,以及所有三种方式进行通信。

   

这有什么实际的通途吗?这可能有吗?

这是一个很好的问题。虽然表面上看来不是很实用应用,我相信,如果有一点想像力,你可以发现其很多重要的现实用途:从推送电子邮件通知到内部电话应用通信。

你将向前迈进四个阶段。在每个阶段,你将了解更多关于Intent receives,services,所有这些应用程序之间的相互作用件:

  • 通知收到一个短信

 

  • 打开短信的内容和找到特殊的净荷

 

  • 当短信到达Activity启动,并且意识到启动发生在接收器的控制下

 

  • 开始一个新的服务,将播放音频文件

 

   

使用Intent Receiver

在你开始编写Intent Receiver之前,你需要了解你为什么会使用他。Intent Receriver没有或几乎没有内存占用、linkage和系统开销。在启动时,一个活动必须将所有大量的引入的类加载,Intent Receriver则没有这些约束。由于某种类型的新Intent可以达到破碎频率(例如网络状态更新),一个轻量级的对象必须在分析数据的第一阶段。如果它是一个适当的时间唤醒一个更大的用户界面程序或大幅后台服务,意图接收机应采取这种行动。

 

提示:意图接收器可以经常的启动和关闭(这依靠他们的监听),试图让它们变地重量轻,使用尽可能少的类库。你的用户不会高兴,如果他们电话在缓慢地爬行,因为你已经插入到太多特定的事件处理开销。

 

编写Intent Receiver

第一件事首先你需要创建一个这个小恶作剧应用程序建立新项目。在源目录中,创建一个新类,将成为新的Intent Receiver。在第一阶段,它看起来应该像这样:

public class PrankSMSReceiver extends IntentReceiver

{

public void onReceiveIntent

(Context context, Intent intent)

{

return;

}

}

现在你已经设定了阶级 你必须告诉你想要 Android 接收 SMS 事件。你可以通过修改 AndroidManifest.xml 文件给你许可和登记 RECEIVE_SMS Intent action

 

权限

运营商,用户,甚至开发人员可能不希望给Android应用自由支配,贯穿其手机和网络的特权层。因此,谷歌推出一种被移动发人员认可的权限概念。为了能够接收短信息,你需要通知手机你可以接收。

在Android中,所有元素的权限声明在特别的配置文件中,你添加的权限在<manifest>标记后(代码2-2)。该示例应用程序将被称为PrankApp。其活动主要是rankActivity。

Code Listing 2-2. Adding Permissions to Receive SMS Messages

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android=

"http://schemas.android.com/apk/res/android"

package="com.apress.book.PrankApp">

<uses-permission android:name=

"android.permission.RECEIVE_SMS" />

没有权限标志,Android将你的应用程序无法启动当它接收到一个短信。还有其他的权限我需要涵盖你向前看。在此期间 你可以找到所有在列表的权限 Android 的文件资料 http://code.google.com/android/reference/android/ Manifest.permission.html

 

向我发送短信!

现在,你已经允许进行与手机的SMS层交互,你必须告诉手机做什么,当一个新的文本信息到达时。要做到这一点,你必须打开AndroidManifest.xml文件,添加一个新的Intent Receiver。代码清单2-3显示了要插入的代码。

Code Listing 2-3. Registering the New Intent Receiver for

Incoming SMSs

</activity>

<receiver android:name=

"PrankSMSReceiver"android:enabled="true">

<intent-filter>

<actionandroid:name="android.provider.Telephony.SMS_RECEIVED"

/>

<categoryandroid:name="android.intent.category.DEFAULT" />

</intent-filter>

</receiver>

这就是你每次必须要接受的 Intent notification 当手机得到一个接收到的 SMS

 

   

Action 中分析 Intent Receiver

要完成这个要比我们想象的有一点困难。一个进程必须在一个 DDMS 中运行 。但在大多数情况下,你不想让应用程序运行,除非新的事件触发它。这问题的解决方案在Eclipse IDE中只是一个小小的把戏。当你一步一步往下走时,这可能会一点一点变得复杂。

在你的onReceiveIntent方法中放置一个断点。开始调试应用程序,并让模拟器位于“Hello World,PrankActivity”屏幕上。在Eclipse中,切换视图到DDMS。你可以按这命令+ F8键几次或选择菜单 Window

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值