`
ijavagos
  • 浏览: 1189626 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Android(六)Activity、请求码与结果码、Intent、广播、服务

阅读更多

一、创建新的Activity

在进行桌面开发时,我们可以通过一个窗口上的控件事件打开另一个新的窗口。在WEB应用开发时,我们也可以通过一个连接打开一个新的页面。通过添加新的窗口开完善或增强软件的功能,那么在Android应用开发中,我们应该怎样打开新的Activity?

1.添加新的Activity(创建Android工程:MainActivity)

1).新建一个继承自Activity类的类NewActivity

package com.changcheng.activity;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

public class NewActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.new_activity);

// 获取按钮并未按钮添加事件

Button button = (Button) this.findViewById(R.id.newa_bt_close);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

NewActivity.this.finish();

}

});

}

}

2).AndroidManifest.xml文件中添加

<!--l version=<-->"1.0" encoding="utf-8"?>

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

package="com.changcheng.activity"

android:versionCode="1"

android:versionName="1.0">

"@drawable/icon" android:label="@string/app_name">

".MainActivity"

android:label="@string/app_name">

"android.intent.action.MAIN" />

"android.intent.category.LAUNCHER" />

<!-- 新的Activity -->

".NewActivity"

android:label="@string/new_activity" />

"7" />

3).newactivity.xml

<!--l version=<-->"1.0" encoding="utf-8"?>

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

android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">

"fill_parent"

android:layout_height="wrap_content" android:text="@string/newa_activity" />

<!-- 关闭按钮 -->

"fill_parent"

android:layout_height="wrap_content" android:text="@string/newa_bt_close"

android:id="@+id/newa_bt_close" />

4).strings.xml

<!--l version=<-->"1.0" encoding="utf-8"?>

"hello">Hello World, MainActivity!

"app_name">创建新的Activity

"bt_open_new_activity">打开新的Activity

"new_activity">新的Activity

"newa_activity">新的Activity

"newa_bt_close">关闭

5).MainActivity.java

package com.changcheng.activity;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

public class MainActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

// 获取按钮,并为按钮添加单击的事件

Button button = (Button) this.findViewById(R.id.bte_open_new_activity);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

// 创建显式意图

Intent intent = new Intent(MainActivity.this, NewActivity.class);

// 打开新的Activity

startActivity(intent);

}

});

}

}

二、Activity之间传递参数

在桌面程序中窗口之间,我们可以通过构造参数或全局变量来传递数据。在WEB应用中,我们可以通过域(request\response\session...)在页面之间传递数据。那如何在Android的Activity之间传递参数呢?

通过intent.putExtra方法为意图添加参数,打开新的Activity后可以通过this.getIntent().getStringExtra()等方法获取参数。

三、请求码与结果码

在上面的程序中我们通过startActivity(intent)打开一个新的Activity,Android为了减少组件间的耦合,所以使用了Intent(Intent在下面会有介绍)。所以我们在onClick事件打开的新Activity不与主Activity在一个线程中。但是,当新Activity被关闭后,会触发主Activity的onActivityResult事件。

1.请求码

在一个业务中可能在两个按钮被单击事件中打开同一个Activity,但我们在onActivityResult事件中如何判断是哪个按钮打开了新的Activity?请求码就是为解决这个问题的,那么我们打开新的Activity时应该使用startActivityForResult(intent, 1);。其中的第二个参数就是请求码。

onActivityResult事件:

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

// TODO Auto-generated method stub

super.onActivityResult(requestCode, resultCode, data);

}

在onactivityResult事件中,通过判断requestCode更可知道被关闭Activity是通过哪个位置打开的。

2.结果码

在一个业务中可能要打开多个不同的Activity,那关闭Activity时在onactivityResult事件中我们如何知道关闭的是哪一个Activity呢?结果码就是为解决这个问题的,那么我们打开新的Activity时应该使用setResult(2, intent);或在关闭Activity前调用ActivityObj.setResult(2);。其中的第一个参数就是结果码。

在onactivityResult事件中,通过判断resultCode更可知道是哪个Activity被关闭了。

三、Intent意图

Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。

Intent可以划分成显式意图和隐式意图:

1).显式意图:调用Intent.setComponent()或Intent.setClass()方法指定了组件名或类对象的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。比如我们上边的打开新的Activity程序。

2).隐式意图:没有调用Intent.setComponent()或Intent.setClass()方法指定组件名或类对象的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。通过隐式意图打开新的Activity:

AndroidManifest.xml:

<!-- 新的Activity -->

".NewActivity" android:label="@string/new_activity">

"com.changcheng.activity.NewActivity"/>

"android.intent.category.DEFAULT" />

MainActivity:

@Override

public void onClick(View v) {

// 创建显式意图

Intent intent = new Intent("com.changcheng.activity.NewActivity");

//Intent intent = new Intent(MainActivity.this, NewActivity.class);

// 打开新的Activity

startActivity(intent);// 发送Intent时,意图里相当于有一个类别:android.intent.category.DEFAULT

}

在intent过滤器中还可以添加多个action和category,还可以添加data。具体使用在此就不做总结了,可以查看相关资料或帮助文档。

3).显式意图与隐式意图的应用场景:

在项目内部建议使用显式意图。

在应用与应用之间只能使用隐式意图。

四、Activity的生命周期

Activity有三个状态:

当它在屏幕前台时(位于当前任务堆栈的顶部),它是激活或运行状态。它就是响应用户操作的Activity。

当它失去焦点但仍然对用户可见时,它处于暂停状态。即在它之上有另外一个Activity。这个Activity也许是透明的,或者没有完全覆盖全屏,所以被暂停的Activity仍对用户可见。暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但系统处于极低内存时仍然可以杀死这个Activity。

完全被另一个Activity覆盖时则处于停止状态。它仍然保留所有的状态和成员信息。然而对用户是不可见的,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个Activity。

当Activity从一种状态转变到另一种状态时,会调用以下保护方法来通知这种变化:

void onCreate(Bundle savedInstanceState)

void onStart()

void onRestart()

void onResume()

void onPause()

void onStop()

void onDestroy()

2010-03-05 传智播客—Android(六)Activity、请求码与结果码、Intent、广播、服务 - 长城 - 长城
这七个事件定义了Activity的完整生命周期。实现这些事件方法可以帮助我们监视其中的三个嵌套生命周期循环:

1).Activity的完整生命周期自第一次调用onCreate()开始,直至调用onDestroy()为止。Activity在onCreate()中设置所有“全局”状态以完成初始化,而在onDestroy()中释放所有系统资源。例如,如果Activity有一个线程在后台运行从网络上下载数据,它会在onCreate()创建线程,而在 onDestroy()销毁线程。

2).Activity的可视生命周期自onStart()调用开始直到相应的onStop()调用结束。在此期间,用户可以在屏幕上看到Activity,尽管它也许并不是位于前台或者也不与用户进行交互。在这两个方法之间,我们可以保留用来向用户显示这个Activity所需的资源。例如,当用户不再看见我们显示的内容时,我们可以在onStart()中注册一个BroadcastReceiver来监控会影响UI的变化,而在onStop()中来注消。onStart() 和 onStop() 方法可以随着应用程序是否为用户可见而被多次调用。

3).Activity的前台生命周期自onResume()调用起,至相应的onPause()调用为止。在此期间,Activity位于前台最上面并与用户进行交互。Activity会经常在暂停和恢复之间进行状态转换——例如当设备转入休眠状态或者有新的Activity启动时,将调用onPause() 方法。当Activity获得结果或者接收到新的Intent时会调用onResume() 方法。关于前台生命周期循环的例子请见PPT下方备注栏。

五、广播接收者

广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,广播接收者和JMS中的Topic消息接收者很相似。要实现一个广播接收者方法如下:

1).继承BroadcastReceiver,并重写onReceive()方法。

2).订阅感兴趣的广播Intent,订阅方法有两种:

· 使用代码进行订阅:

IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

IncomingSMSReceiver receiver = new IncomingSMSReceiver();

registerReceiver(receiver, filter);

· 在AndroidManifest.xml文件中的节点里进行订阅:

通常一个BroadcastReceiver对象的生命周期不超过5秒,所以在BroadcastReceiver里不能做一些比较耗时的操作,如果需要完成一项比较耗时的工作,可以通过发送Intent给Activity或Service,由Activity或Service来完成。

六、服务

Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。服务的开发比较简单,如下:

1.继承Service类

public class SMSService extends Service { }

2.在AndroidManifest.xml文件中的节点里对服务进行配置:

服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。

如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。

分享到:
评论

相关推荐

    Android Intent测试例子

    Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作。简单来说Intent就是用于组件(这里的组件自然是四大组件)之间传递消息。 它的基本用途:启动Activity,启动服务,传递广播。

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    Android开发案例驱动教程 配套代码

    《Android开发案例驱动教程》 配套代码。 注: 由于第12,13,14章代码太大,无法上传到一个包中。 这三节代码会放到其他压缩包中。 作者:关东升,赵志荣 Java或C++程序员转变成为Android程序员 采用案例驱动模式...

    疯狂Android讲义源码

     4.1.5 启动其他Activity并返回结果 185  4.2 Activity的回调机制 189  4.3 Activity的生命周期 190  4.3.1 Activity的生命周期演示 190  4.3.2 Activity与Servlet的相似性与  区别 194  4.4 本章小结 195  ...

    精通ANDROID 3(中文版)1/2

    5.1 Android Intent基础知识  5.2 Android中可用的Intent  5.3 Intent的组成  5.3.1 Intent和数据URI  5.3.2 一般操作  5.3.3 使用extra信息  5.3.4 使用组件直接调用活动  5.3.5 Intent类别  5.3.6...

    android 面试2

     答:在AndriodMinifest.xml文件中配置Activity的属性的主题为android:theme="@android:style/Theme.Dialog"  4. 如何退出Activity?如何安全退出已调用多个Activity的Application?  答:单个的Activity,调用...

    Android典型技术模块开发详解

    第一篇 Android开发初步 第1章 Android初识 1.1 Android简介 1.1.1 认识Android 1.1.2 Android系统框架 1.1.3 应用程序框架 1.2 Eclipse开发环境 1.2.1 安装ADT插件 1.2.2 安装SDK 1.2.3 配置源代码 1.2.4 创建AVD ...

    《Android开发从零开始视频教程》下载地址

    [Android开发从零开始].7.Intent初级学习.mp4 67.9MB [Android开发从零开始].8.Activity生命周期.mp4 53.1MB [Android开发从零开始].9.Activity高级学习.mp4 49.5MB [Android开发从零开始].10.LinearLayout学习....

    疯狂Android讲义.part2

    第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 1.2.2 安装Eclipse和ADT插件 7 ...

    疯狂Android讲义.part1

    第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 1.2.2 安装Eclipse和ADT插件 7 ...

    精通Android 3 (中文版)2/2

    第1章 Android计算平台简介  1.1 面向新PC的全新平台  1.2 Android的历史  1.3 Dalvik VM剖析  1.4 理解Android软件栈  1.5 使用Android SDK开发最终用户应用程序  1.5.1 Android模拟器  1.5.2 ...

    adb1.0.26包含fastboot.exe

    有的设备,比如小米 5S + MIUI 8.0 + Android 6.0.1 MXB48T,可能在第 5 步之前需要重启 adbd 服务,在设备的终端模拟器上运行: restart adbd 如果 restart 无效,尝试以下命令: start adbd stop adbd 应用管理 ...

    andriod精华学习教程

    话框,因为你的应用程序并没有给自己机会来处理输入事件或者Intent广播。 因此,运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在 它的关键生命周期方法(如onCreate()和onResume())里尽可能少的...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--Activity不允许横竖屏切换 |--Activity常用小技巧 |--Activity按返回直接回到桌面 |--aidl之结合反射获取应用缓存大小等空间占用 |--aidl调用系统service未公开的方法挂电话 |--aidl调用系统未公开的方法代码示例...

    Android编程创建桌面快捷方式的常用方法小结【2种方法】

    第一个是通过广播(Broadcast)的形式向Luncher发送请求生成快捷方式的。 在网上找到关于这方面的注册信息。 &lt;!--设置wallpapaer的activity --&gt; &lt;!-- Intent received used to install shortc

    Android 基于Socket的聊天室实例

    Client A 发信息给 Client B , A的信息首先发送信息到服务器Server ,Server接受到信息后再把A的信息广播发送给所有的Clients 首先我们要在服务器建立一个ServerSocket ,ServerSocket对象用于监听来自客户端的...

    Android调用微信登陆、分享、支付

    接收微信的请求及返回值 如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面3步操作:  a. 在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,...

Global site tag (gtag.js) - Google Analytics