• Activity详解一 配置、启动和关闭activity转载 https://www.cnblogs.com/androidWuYou/p/5887726.html


    先看效果图:

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

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

    1.如何创建一个Activity?

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

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

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

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

    2创建Activity  

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class MainActivity extends Activity { 
     
        //必须重写的方法 
     
        @Override 
     
        protected void onCreate(Bundle savedInstanceState) { 
     
            super.onCreate(savedInstanceState); 
     
            setContentView(R.layout.activity_main);//activity的布局 
     
        
     

     

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <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中,允许用户直接启动。以上也是一个应用的主activity所必须的声明方法:一个MAIN action,和一个LAUNCHER category。如果要Activity响应其他应用的隐式的intent,则需要为Activity声明对应action,还可以添加categor和data。

    3.Activity的启动

    3.1 startActivity

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

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

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

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

                  

    1
    2
    3
    4
    5
    6
    7
    //跨应用从google界面搜索 
     
                  Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); 
     
                  intent.putExtra(SearchManager.QUERY, "zy"); 
     
                  startActivity(intent); 

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Intent intent = new Intent(); 
     
    //指定要启动组建完整的包名,对象名 
     
    ComponentName cn = new ComponentName("com.android.settings"
     
            "com.android.settings.RunningServices"); 
     
    intent.setComponent(cn); 
     
    // 使用context.startActivity()时需要新启一个任务 
     
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     
    startActivity(intent); 

    3.2 startActivityForResult

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

             

    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
    Intent intent = new Intent(Intent.ACTION_PICK, 
     
                            Contacts.People.CONTENT_URI); 
     
                    //启动一个带有选择联系人返回结果的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 }, nullnullnull); 
     
               
     
            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()的方法关闭一个独立的之前启动的Activity。

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

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

     this.finishActivity(requestCode);  

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

    5 Demo代码:

    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
    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);
        }
       //启动第一个activity
        public void startFirstActivity(View view) {
            Intent intent = new Intent(this, TestUseAActivity2.class);
            startActivity(intent);
        }
        //启动第二个activity
        public void startSecondActivity(View view) {
            Intent intent = new Intent(this, TestUseAActivity3.class);
            startActivity(intent);
        }
        //启动第三个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();
     
        }
    }
  • 相关阅读:
    Win10系统接口自动化测试持续集成
    postman结合newman生成测试报告
    关于sass(scss)、less、postcss、stylus的简介与区别
    python 对pdf的response进行操作(如:去掉首页)
    存数据的格式
    json文本格式化
    python处理时间
    @SuppressWarning
    【源码笔记】构建Spring源码环境
    手写一个模拟的ReentrantLock
  • 原文地址:https://www.cnblogs.com/Jeely/p/11040487.html
Copyright © 2020-2023  润新知