程序员人生 网站导航

Activity详解一 配置、启动和关闭activity

栏目:综合技术时间:2016-10-31 10:55:59

先看效果图

Android为我们提供了4种应组件,分别为Activity、Service、Broadcast receivers和Content providers,这些组建也就是我们开发1个Android利用程序的基石。系统可以通过不同组建提供的切入点进入到开发的利用程序中。对用户来讲不是所有的组建都是实际的切入点,但是他们之间都是相互依赖的,它们每个作为存在的实体,扮演着特定的角色,作为唯一无2的基石帮助开发者定义Android利用的行动。下面我将整理自己的Activity学习点滴:

        1个Acitvity作为1个显示在屏幕上的用户交互界面,比如在电子邮件利用中,1个用来显示收件列表的Activity,1个用来写邮件的Activity,1个浏览邮件内容的Activity,等等。Activity用来提供用户体验,许多不同体验的Activity聚集在1起便可以构成1个Android利用程序的用户体验,每Activity都是相互独立的。利用除可以访问自己的Activity,也能够访问其他APP的Acitivity(需要被APP允许)。

1.如何创建1个Activity?

    必须创建1个Activity的 子类,在子类中需要实现Activity状态在生命周期中切换时系统回调的函数(onCreate、onStart、onResume、onPause、onStop、onDestroy),固然并不是所有的函数都需要重新实现。其中两个比较重要的函数为onCreate和onPause:

          onCreate(),此方法必须要重写。系统调用此方法创建activity,实现该方法是你初始化你所创建Activity的重要步骤。其中最重要的就是调用 setContentView() 去定义你的要展现的用户界面的布局。

          onPause(),当系统任务用户离开此界面时会调用此方法,此时并不是烧毁1个Activity。通常在这里就要处理1些持久超出用户会话的变化,比如:数据的保存。

         为了保证流畅的用户体验和处理,你可以调用其他的回调函数来使你的Atctivity停止或烧毁。在onStop()方法中,1般做1些大资源货对象的释放,如:网络或数据库连接。可以在onResume时再加载所需要资源。

2创建Activity  

public class MainActivity extends Activity { //必须重写的方法 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);//activity的布局 } }

 

 

       2.1个Activity创建完成后,为了它可以访问系统必须要声明注册它到利用的AndroidManifest.xml文件中:

<activity android:name="com.zy.demo.activity.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>


      <activity>有很多属性供开发者定义不同特点的Activity,比如lable、icon或theme、style等。其中android:name是必须的属性,用来定义activity的名字,当利用发布后不能改变。

        <activity>还提供各种intent-filter,使用<intent-filter>来声明其它利用组件如何激活(启动)Activity,<intent-filter>有包括<action>和<category>两个元素。如上例中<action android:name="android.intent.action.MAIN" />用来表示此Activity需要响应android.intent.action.MAIN(表明为利用程序的主要入口),<category android:name="android.intent.category.LAUNCHER" />表示Activity为LAUNCHER种别,即利用程序会列在Launcher中,允许用户直接启动。以上也是1个利用的主activity所必须的声明方法:1个MAIN action,和1个LAUNCHER category。如果要Activity响应其他利用的隐式的intent,则需要为Activity声明对应action,还可以添加categor和data。

3.Activity的启动

3.1 startActivity

        通过调用startActivity(intent)启动Activity,intent用来准确的描写你要启动的Activity,或你要进行的action,intent也能够用来携带小数据给被启动Acitivity。

           当在同1个利用中间需要简单启动另外一个Activity,intent明确的定义你要启动Activity类便可:

//定义1个intent,指名要启动的activity:ToStartActivity Intent intent = new Intent(MainActivity.this,ToStartActivity.class); //使用startActivity(),启动activity startActivity(intent);

 

           在你的利用程序需要履行1些本身没有Activity可以履行的行动时,我们可使用手机上的其他利用程序的Activity来代替履行。比如发送1个mail、查看1张图片、搜索1个单词等等。这个里也就是Intent的重要指出,你可以定义1个intent描写你想要做的行动,等你发送给系统后,系统会启动适合的Acitivty帮你履行,如果有多个利用的Activity都可以处理此行动时,系统会让用户去选择1个。当此Activity履行终了后,原来的Activity将比

              

//跨利用从google界面搜索 Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY, "zy"); startActivity(intent);

 

     当跨利用启动Activity时,在定义intent时必须要为他指定具体的acitvity,条件是此activity必须暴露在自己利用程序以外(android:exported="true"):

Intent intent = new Intent(); //指定要启动组建完全的包名,对象名 ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.RunningServices"); intent.setComponent(cn); // 使用context.startActivity()时需要新启1个任务 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);

 

3.2 startActivityForResult

       通过调用 startActivityForResult(intent),来接收到启动的Acitivity反馈的结果。为了接收接下来启动的Activity的结果,需要重写onActivityResult()这个回调函数。当调用的activity完成后,它将返回1个含有结果的intent给onActivityResult()处理。比如,在利用程序的Activity中,需要用户选择联系人中的1个,Activity需要得到联系人的部份信息:

         

Intent intent = new Intent(Intent.ACTION_PICK, Contacts.People.CONTENT_URI); //启动1个带有选择联系人返回结果的activity startActivityForResult(intent, PICK_CONTACT_REQUEST); 这里的PICK_CONTACT_REQUEST为自定义的int型要求反馈结果代码。 //重新onActivityResult()用来处理接收到的返回结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // 如果要求requestCode成功,且要求返回的结果resultCode是我们要的PICK_CONTACT_REQUEST if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) { // 处理Intent返回的数据,在联系人数据库中查找联系人的名字 Cursor cursor = getContentResolver().query(data.getData(), new String[] { Contacts.People.NAME }, null, null, null); if (cursor.moveToFirst()) { // 如果cursor不为空,就查找出联系人的名字 int columnIndex = cursor.getColumnIndex(Contacts.People.NAME); String name = cursor.getString(columnIndex); //添加其他功能 } } }

 

        这里在要说明是onActivityResult()使用来处理返回结果的,首先要检查的是要求是不是成功,然后是不是有返回结果,结果是不是是startActivityForResult()中所要的,如果满足,则处理通过Intent返回的数据。

4.关闭Activity

1  Activity可以调用finish()方法关闭自己,也能够通过调用finishActivity()的方法关闭1个独立的之前启动的Activity。

2 调用finishActivity()的方法关闭1个独立的之前启动的Activity

 //此方法用在关闭使用startActivityForResult(requestCode)启用的Activity  

 this.finishActivity(requestCode);  

           关于什么时候关闭1个Activity,1般由系统直接为我们管理。但是当你确认用户不用返回到此Activity时,我们调用以上方法关闭对应的Activity。

 

5 Demo代码:

package mm.shandong.com.testusea; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; public class TestUseAActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test_use_a); } //启动第1个activity public void startFirstActivity(View view) { Intent intent = new Intent(this, TestUseAActivity2.class); startActivity(intent); } //启动第2个activity public void startSecondActivity(View view) { Intent intent = new Intent(this, TestUseAActivity3.class); startActivity(intent); } //启动第3个activity,这个activity 4秒钟后被关闭 public void startThirdActivity(View view) { Intent intent = new Intent(this, TestUseAActivity4.class); startActivityForResult(intent, 1); new Thread() { @Override public void run() { try { Thread.sleep(4000); finishActivity(1); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } }

本人微博:honey_11

 Demo下载 
最后,以上例子都来源与安卓无忧,请去利用宝或豌豆荚下载:例子源码,源码例子文档1网打尽。



------分隔线----------------------------
------分隔线----------------------------

最新技术推荐