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

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

 
阅读更多
<p><strong>一、创建新的</strong><strong>Activity</strong></p>
<p>在进行桌面开发时,我们可以通过一个窗口上的控件事件打开另一个新的窗口。在WEB应用开发时,我们也可以通过一个连接打开一个新的页面。通过添加新的窗口开完善或增强软件的功能,那么在Android应用开发中,我们应该怎样打开新的Activity?</p>
<p><strong>1.</strong><strong>添加新的Activity(创建Android工程:MainActivity)</strong></p>
<p>1).新建一个继承自Activity类的类NewActivity</p>
<p><strong>package</strong> com.changcheng.activity;</p>
<p><strong>import</strong> android.app.Activity;</p>
<p><strong>import</strong> android.os.Bundle;</p>
<p><strong>import</strong> android.view.View;</p>
<p><strong>import</strong> android.widget.Button;</p>
<p><strong>public</strong> <strong>class</strong> NewActivity <strong>extends</strong> Activity {</p>
<p>@Override</p>
<p><strong>protected</strong> <strong>void</strong> onCreate(Bundle savedInstanceState) {</p>
<p><strong>super</strong>.onCreate(savedInstanceState);</p>
<p>setContentView(R.layout.<em>new_activity</em>);</p>
<p>// 获取按钮并未按钮添加事件</p>
<p>Button button = (Button) <strong>this</strong>.findViewById(R.id.<em>newa_bt_close</em>);</p>
<p>button.setOnClickListener(<strong>new</strong> View.OnClickListener() {</p>
<p>@Override</p>
<p><strong>public</strong> <strong>void</strong> onClick(View v) {</p>
<p>NewActivity.<strong>this</strong>.finish();</p>
<p>}</p>
<p>});</p>
<p>}</p>
<p>}</p>
<p>2).AndroidManifest.xml文件中添加</p>
<p>&lt;!--l version=&lt;--&gt;"1.0" encoding=<em>"utf-8"</em>?&gt;</p>
<p>"http://schemas.android.com/apk/res/android"</p>
<p>package=<em>"com.changcheng.activity"</em></p>
<p>android:versionCode=<em>"1"</em></p>
<p>android:versionName=<em>"1.0"</em>&gt;</p>
<p>"@drawable/icon" android:label=<em>"@string/app_name"</em>&gt;</p>
<p>".MainActivity"</p>
<p>android:label=<em>"@string/app_name"</em>&gt;</p>
<p></p>
<p>"android.intent.action.MAIN" /&gt;</p>
<p>"android.intent.category.LAUNCHER" /&gt;</p>
<p></p>
<p></p>
<p>&lt;!-- 新的Activity --&gt;</p>
<p>".NewActivity"</p>
<p>android:label=<em>"@string/new_activity"</em> /&gt;</p>
<p></p>
<p>"7" /&gt;</p>
<p></p>
<p>3).newactivity.xml</p>
<p>&lt;!--l version=&lt;--&gt;"1.0" encoding=<em>"utf-8"</em>?&gt;</p>
<p>"http://schemas.android.com/apk/res/android"</p>
<p>android:orientation=<em>"vertical"</em> android:layout_width=<em>"fill_parent"</em> android:layout_height=<em>"fill_parent"</em>&gt;</p>
<p>"fill_parent"</p>
<p>android:layout_height=<em>"wrap_content"</em> android:text=<em>"@string/newa_activity"</em> /&gt;</p>
<p>&lt;!-- 关闭按钮 --&gt;</p>
<p></p>
<p>"fill_parent" </p>
<p>android:layout_height=<em>"wrap_content"</em> android:text=<em>"@string/newa_bt_close"</em></p>
<p>android:id=<em>"@+id/newa_bt_close"</em> /&gt;</p>
<p></p>
<p>4).strings.xml</p>
<p>&lt;!--l version=&lt;--&gt;"1.0" encoding=<em>"utf-8"</em>?&gt;</p>
<p></p>
<p>"hello"&gt;Hello World, MainActivity!</p>
<p>"app_name"&gt;创建新的Activity</p>
<p>"bt_open_new_activity"&gt;打开新的Activity</p>
<p>"new_activity"&gt;新的Activity</p>
<p>"newa_activity"&gt;新的Activity</p>
<p>"newa_bt_close"&gt;关闭</p>
<p></p>
<p>5).MainActivity.java</p>
<p><strong>package</strong> com.changcheng.activity;</p>
<p><strong>import</strong> android.app.Activity;</p>
<p><strong>import</strong> android.content.Intent;</p>
<p><strong>import</strong> android.os.Bundle;</p>
<p><strong>import</strong> android.view.View;</p>
<p><strong>import</strong> android.widget.Button;</p>
<p><strong>public</strong> <strong>class</strong> MainActivity <strong>extends</strong> Activity {</p>
<p>/** Called when the activity is first created. */</p>
<p>@Override</p>
<p><strong>public</strong> <strong>void</strong> onCreate(Bundle savedInstanceState) {</p>
<p><strong>super</strong>.onCreate(savedInstanceState);</p>
<p>setContentView(R.layout.<em>main</em>);</p>
<p>// 获取按钮,并为按钮添加单击的事件</p>
<p>Button button = (Button) <strong>this</strong>.findViewById(R.id.<em>bte_open_new_activity</em>);</p>
<p>button.setOnClickListener(<strong>new</strong> View.OnClickListener() {</p>
<p>@Override</p>
<p><strong>public</strong> <strong>void</strong> onClick(View v) {</p>
<p>// 创建显式意图</p>
<p>Intent intent = <strong>new</strong> Intent(MainActivity.<strong>this</strong>, NewActivity.<strong>class</strong>);</p>
<p>// 打开新的Activity</p>
<p>startActivity(intent);</p>
<p>}</p>
<p>});</p>
<p>}</p>
<p>}</p>
<p><strong>二、</strong><strong>Activity</strong><strong>之间传递参数</strong></p>
<p>在桌面程序中窗口之间,我们可以通过构造参数或全局变量来传递数据。在WEB应用中,我们可以通过域(request/response/session...)在页面之间传递数据。那如何在Android的Activity之间传递参数呢?</p>
<p>通过intent.putExtra方法为意图添加参数,打开新的Activity后可以通过this.getIntent().getStringExtra()等方法获取参数。</p>
<p><strong>三、请求码与结果码</strong></p>
<p><strong></strong>在上面的程序中我们通过startActivity(intent)打开一个新的Activity,Android为了减少组件间的耦合,所以使用了Intent(Intent在下面会有介绍)。所以我们在onClick事件打开的新Activity不与主Activity在一个线程中。但是,当新Activity被关闭后,会触发主Activity的onActivityResult事件。<strong> </strong></p>
<p><strong>1.请求码</strong></p>
<p>在一个业务中可能在两个按钮被单击事件中打开同一个Activity,但我们在onActivityResult事件中如何判断是哪个按钮打开了新的Activity?请求码就是为解决这个问题的,那么我们打开新的Activity时应该使用startActivityForResult(intent, 1);。其中的第二个参数就是请求码。</p>
<p>onActivityResult事件:</p>
<p>@Override</p>
<p><strong>protected</strong> <strong>void</strong> onActivityResult(<strong>int</strong> requestCode, <strong>int</strong> resultCode, Intent data) {</p>
<p>// <strong>TODO</strong> Auto-generated method stub</p>
<p><strong>super</strong>.onActivityResult(requestCode, resultCode, data);</p>
<p>}</p>
<p>在onactivityResult事件中,通过判断requestCode更可知道被关闭Activity是通过哪个位置打开的。</p>
<p><strong>2.</strong><strong>结果码</strong></p>
<p>在一个业务中可能要打开多个不同的Activity,那关闭Activity时在onactivityResult事件中我们如何知道关闭的是哪一个Activity呢?结果码就是为解决这个问题的,那么我们打开新的Activity时应该使用setResult(2, intent);或在关闭Activity前调用ActivityObj.setResult(2);。其中的第一个参数就是结果码。</p>
<p>在onactivityResult事件中,通过判断resultCode更可知道是哪个Activity被关闭了。</p>
<p><strong>三、</strong><strong>Intent</strong><strong>意图</strong></p>
<p>Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。</p>
<p>Intent可以划分成显式意图和隐式意图:</p>
<p>1).显式意图:调用Intent.setComponent()或Intent.setClass()方法指定了组件名或类对象的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。比如我们上边的打开新的Activity程序。</p>
<p>2).隐式意图:没有调用Intent.setComponent()或Intent.setClass()方法指定组件名或类对象的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。通过隐式意图打开新的Activity:</p>
<p>AndroidManifest.xml:</p>
<p>&lt;!-- 新的Activity --&gt;</p>
<p>".NewActivity" android:label=<em>"@string/new_activity"</em>&gt;</p>
<p></p>
<p>"com.changcheng.activity.NewActivity"/&gt;</p>
<p>"android.intent.category.DEFAULT" /&gt;</p>
<p></p>
<p></p>
<p>MainActivity:</p>
<p>@Override</p>
<p><strong>public</strong> <strong>void</strong> onClick(View v) {</p>
<p>// 创建显式意图</p>
<p>Intent intent = <strong>new</strong> Intent("com.changcheng.activity.NewActivity");</p>
<p>//Intent intent = new Intent(MainActivity.this, NewActivity.class);</p>
<p>// 打开新的Activity</p>
<p>startActivity(intent);// 发送Intent时,意图里相当于有一个类别:android.intent.category.DEFAULT</p>
<p>}</p>
<p>在intent过滤器中还可以添加多个action和category,还可以添加data。具体使用在此就不做总结了,可以查看相关资料或帮助文档。</p>
<p>3).显式意图与隐式意图的应用场景:</p>
<p>在项目内部建议使用显式意图。</p>
<p>在应用与应用之间只能使用隐式意图。</p>
<p><strong>四、</strong><strong>Activity</strong><strong>的生命周期</strong></p>
<p>Activity有三个状态:</p>
<p>当它在屏幕前台时(位于当前任务堆栈的顶部),它是激活或运行状态。它就是响应用户操作的Activity。</p>
<p>当它失去焦点但仍然对用户可见时,它处于暂停状态。即在它之上有另外一个Activity。这个Activity也许是透明的,或者没有完全覆盖全屏,所以被暂停的Activity仍对用户可见。暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但系统处于极低内存时仍然可以杀死这个Activity。</p>
<p>完全被另一个Activity覆盖时则处于停止状态。它仍然保留所有的状态和成员信息。然而对用户是不可见的,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个Activity。</p>
<p>当Activity从一种状态转变到另一种状态时,会调用以下保护方法来通知这种变化:</p>
<p>void onCreate(Bundle savedInstanceState)</p>
<p>void onStart()</p>
<p>void onRestart()</p>
<p>void onResume()</p>
<p>void onPause()</p>
<p>void onStop()</p>
<p>void onDestroy()</p>
<p><img title="2010-03-05 传智播客—Android(六)Activity、请求码与结果码、Intent、广播、服务 - 长城 - 长城" src="http://lh4.ggpht.com/_FMPy3IVGHrs/S5MSUmG-3AI/AAAAAAAABm0/tmXgf61IE2o/2FEBB48DB7BF9CE95C7B6AEBC9630A2B3FC1C4F6.jpg?imgmax=800" border="0" alt="2010-03-05 传智播客—Android(六)Activity、请求码与结果码、Intent、广播、服务 - 长城 - 长城" width="538" height="668"><br>这七个事件定义了Activity的完整生命周期。实现这些事件方法可以帮助我们监视其中的三个嵌套生命周期循环:</p>
<p>1).Activity的完整生命周期自第一次调用onCreate()开始,直至调用onDestroy()为止。Activity在onCreate()中设置所有“全局”状态以完成初始化,而在onDestroy()中释放所有系统资源。例如,如果Activity有一个线程在后台运行从网络上下载数据,它会在onCreate()创建线程,而在 onDestroy()销毁线程。</p>
<p>2).Activity的可视生命周期自onStart()调用开始直到相应的onStop()调用结束。在此期间,用户可以在屏幕上看到Activity,尽管它也许并不是位于前台或者也不与用户进行交互。在这两个方法之间,我们可以保留用来向用户显示这个Activity所需的资源。例如,当用户不再看见我们显示的内容时,我们可以在onStart()中注册一个BroadcastReceiver来监控会影响UI的变化,而在onStop()中来注消。onStart() 和 onStop() 方法可以随着应用程序是否为用户可见而被多次调用。</p>
<p>3).Activity的前台生命周期自onResume()调用起,至相应的onPause()调用为止。在此期间,Activity位于前台最上面并与用户进行交互。Activity会经常在暂停和恢复之间进行状态转换——例如当设备转入休眠状态或者有新的Activity启动时,将调用onPause() 方法。当Activity获得结果或者接收到新的Intent时会调用onResume() 方法。关于前台生命周期循环的例子请见PPT下方备注栏。</p>
<p><strong>五、广播接收者</strong></p>
<p>广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,广播接收者和JMS中的Topic消息接收者很相似。要实现一个广播接收者方法如下:</p>
<p>1).继承BroadcastReceiver,并重写onReceive()方法。</p>
<p>2).订阅感兴趣的广播Intent,订阅方法有两种:</p>
<p>· 使用代码进行订阅:</p>
<p>IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");</p>
<p>IncomingSMSReceiver receiver = new IncomingSMSReceiver();</p>
<p>registerReceiver(receiver, filter);</p>
<p>· 在AndroidManifest.xml文件中的节点里进行订阅:</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p>通常一个BroadcastReceiver对象的生命周期不超过5秒,所以在BroadcastReceiver里不能做一些比较耗时的操作,如果需要完成一项比较耗时的工作,可以通过发送Intent给Activity或Service,由Activity或Service来完成。</p>
<p><strong>六、服务</strong></p>
<p>Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。服务的开发比较简单,如下:</p>
<p>1.继承Service类</p>
<p>public class SMSService extends Service { }</p>
<p>2.在AndroidManifest.xml文件中的节点里对服务进行配置:</p>
<p></p>
<p>服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。</p>
<p>如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。</p>
<p>如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()--&gt;onDestroy()方法。</p>
分享到:
评论

相关推荐

    Activity、Bundle、请求码与结果码、Intent、广播、服务 (二)

    在Android应用开发中,Activity、Bundle、请求码与结果码、Intent、广播和服务是核心组件,它们构成了Android应用运行的基本框架。这篇博文将深入探讨这些概念及其相互关系,旨在帮助开发者更好地理解和运用。 首先...

    Activity、Bundle、请求码与结果码、Intent、广播、服务 (三)

    在Android开发中,Activity、Bundle、请求码与结果码、Intent、广播以及服务是核心组件,它们构成了Android应用的基础架构。接下来,我们将深入探讨这些概念及其应用。 首先,Activity是Android应用程序的基本单元...

    Activity、Bundle、请求码与结果码、Intent、广播、服务 (四)

    在Android应用开发中,Activity、Bundle、请求码与结果码、Intent、广播和服务是核心组件,它们构成了Android系统运行应用程序的基础框架。这篇文章将深入解析这些概念,并通过源码分析和实用工具来帮助开发者更好地...

    Android Activity和Intent机制学习笔记

    ### Android Activity和Intent机制详解 #### 一、Activity机制概览 **1.1 定义及作用** 在Android开发中,Activity是最基本的应用组件之一,可以将其理解为用户界面的一个屏幕。它提供了用户与应用交互的主要场所...

    Android+Intent机制实例详解.rar

    使用startActivity(Intent)或startActivityForResult(Intent, 请求码)方法启动Activity。startActivityForResult()用于需要接收返回结果的情况。 五、启动Service 使用startService(Intent)或bindService(Intent, ...

    Android Intent Filter用法

    在Android应用开发中,Intent Filter是一个至关重要的概念,它用于定义一个组件(如Activity或BroadcastReceiver)能够响应的Intent类型。Intent Filter就像一个过滤器,筛选出应用可以处理的特定操作,使得系统能够...

    android intent 代码

    显式Intent用于指定要启动的确切组件(Activity或Service),而隐式Intent则是向系统广播一个行动请求,任何符合Intent过滤器的组件都可以响应。 2. 创建Intent 创建Intent非常简单,你可以使用`new Intent()`构造...

    Activity与Intent

    3. **Intent-filter**:Activity可以通过定义Intent-filter来响应特定类型的Intent请求,比如启动一个用于选择图片的Activity就需要声明ACTION_PICK这个Intent-filter。 4. **回退栈**:每个Activity都位于一个任务...

    android系统广播大全 Intent跳转界面

    Intent 是 Android 中的一种机制,可以将动作和数据封装起来,用于启动 Activity、服务或广播接收器。下面是 Android 系统广播大全 Intent 跳转界面的一些重要知识点: 1. ACTION_MAIN:作为主要的进入口,不期望去...

    Android 官方SDK文档 Intent

    `Intent`类的主要功能在于提供了一种机制,用于不同应用程序之间或同一应用内部组件之间的数据传递与操作请求。 #### 直接子类:`LabeledIntent` `LabeledIntent`作为`Intent`的一个特殊子类,允许为特定的意图...

    安卓Android源码——Activity设置相同的action进行判断源码.zip

    在安卓(Android)系统中,Activity是应用程序的基本组件,它负责与用户交互并展示界面。当我们创建多个Activity并希望它们响应相同的Intent Action时,需要理解Android如何处理这些Intent以及如何在源码层面进行...

    Android 获取来电号码和去电号码

    在Android系统中,获取来电和去电号码是开发者经常需要处理的任务,这主要涉及到电话管理和广播接收器的相关知识。下面将详细阐述如何实现这一功能。 首先,我们需要了解Android的权限管理。由于涉及到用户隐私,...

    Android Intent用法大全

    在Android开发中,`Intent`是一个非常重要的概念,它主要用于组件之间的通信,比如启动一个Activity、服务、广播接收器等。本篇文章将详细介绍Intent的各种常见用法,包括但不限于:启动浏览器、显示地图、拨打电话...

    Android中Intent使用、数据回写(显)

    在Android开发中,Intent是一个非常重要的组件,它用于在应用程序的不同组件之间传递消息,实现活动(Activity)、服务(Service)、广播接收器(BroadcastReceiver)以及Content Provider之间的通信。本篇文章将...

    android 接收屏幕广播例子

    在Android开发中,广播接收器(BroadcastReceiver)是一种重要的组件,它允许应用程序监听并响应系统或自定义事件。本文将详细讲解如何在Android中创建一个接收屏幕状态改变广播的示例。 首先,我们需要理解Android...

    Android使用Intent实现Camera功能

    在Android应用开发中,Intent是连接各个组件的重要桥梁,它用于启动活动(Activity)、服务(Service)或广播接收器(Broadcast Receiver)。当我们想要调用系统相机功能时,Intent扮演了关键角色。本教程将深入讲解...

    Android 学习(26)Intent 分类

    - 实现服务间的通信,通过Intent传递数据和服务之间的请求。 总结来说,Intent是Android系统中组件间交互的关键工具,而Broadcast Receiver则用于监听和响应系统或自定义的广播事件。理解并熟练掌握这两者,对于...

    android Intent实例

    它可以被用来启动一个新的Activity(活动)、启动服务、广播事件等。`Intent`主要有两种形式:显式Intent和隐式Intent。 - **显式Intent**:明确指定目标组件的名称,常用于同一个应用程序内部组件之间的通信。 - *...

Global site tag (gtag.js) - Google Analytics