zoukankan      html  css  js  c++  java
  • android83 Activity的生命周期,启动模式,返回时传递数据

    #Android四大组件
    * Activity
    * BroadCastReceiver
    * Service
    * ContentProvider
    
    
    
    #Activity生命周期
    * oncreate:Activity对象创建完毕,但此时不可见
    * onstart:Activity在屏幕可见,但是此时没有焦点(不能够点,不能够交互)
    * onResume:Activity在屏幕可见,并且获得焦点
    * onPause:Activity此时在屏幕依然可见,但是已经没有焦点
    * onStop:Activity已经不可见了,但此时Activity的对象还在内存中
    * onDestroy:Activity对象被销毁
    
    ###内存不足
    * 内存不足时,系统会优先杀死后台Activity所在的进程,都杀光了,如果内存还是不足,那么就会杀死暂停状态的Activity所在的进程,如果还是不够,有可能杀死前台进程
    * 如果有多个后台进程,在选择杀死的目标时,采用最近最少使用算法(LRU)
    
    ---
    ###Activity任务栈(按返回键时会依次出栈进行显示)
    * 应用运行过程中,内存中可能会打开多个Activity,那么所有打开的Activity都会被保存在Activity任务栈
    * 栈:后进先出,最先进栈,就会最后出栈
    
    
    ###Activity的启动模式4种:
    1. 标准模式:默认就是这个模式(启动一个就在站上加一个,没有复用)
    2.singleTop:如果目标Activity不在栈顶,那么就会启动一个新的Activity,如果已经在栈顶了,那么就不会再启动了(前台的页面是栈顶的Acticity)
    3.singleTask:如果栈中没有该Activity,那么启动(返回键显示时,返回就是从栈中取出Activity)时就会创建一个该Activity,如果栈中已经有该Activity的实例存在了,那么在启动时,就会杀死在栈中处于该Activity上方的所有Activity全部杀死,那么此时该Activity就成为了栈顶Activity。查看多个网页的时候看起来是打开了多个网页其实只有一个Activity在切换。
    * singleTask的作用:保证整个栈中只有一个该Activity的实例,第一次启动是创建新的,以后都不会创建而是返回。
    4.singleInstance:设为此模式的Activity会有一个自己独立的任务栈,该Activity的实例只会创建一个,保存在独立的任务栈中,这个任务栈不同于非单例模式的Activity的任务栈,不是单例模式则所有的Activity都保存在同一个任务栈,不是单例模式的Activity启动多次则会在任务栈中有多个。
    *singleInstance的作用:保证整个系统的内存中只有一个该Activity的实例,不同的应用使用同一个activity,10个应用启动都是同一个Activity,例如打电话时启动的都是同一个打电话的Activity。
    
    ---
    #横竖屏的切换
    * Activity在横竖屏切换时会销毁重建,目的就是为了读取新的布局文件(横竖屏是有2套布局文件的)
    * 写死方向,不允许切换
    
            android:screenOrientation="portrait"
             android:screenOrientation="landscape"
    * 配置Activity时添加以下属性,横竖屏切换时就不会销毁重建
    
            android:configChanges="orientation|keyboardHidden|screenSize"
     //设置当前Activity的方向,使用代码控制横竖屏(onCreat方法中写)
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    ---
    #Activity返回时传递数据
    * 请求码:用来区分数据来自于哪一个Activity
    * 结果码:用来区分,返回的数据时属于什么类型
    
    #掌握开启activity获取返回值
    ###从A界面打开B界面, B界面关闭的时候,返回一个数据给A界面
    步骤:
    1. 开启activity并且获取返回值
    
            startActivityForResult(intent, 0);
    2. 在新开启的界面里面实现设置数据的逻辑
        
            Intent data = new Intent();
            data.putExtra("phone", phone);
            //设置一个结果数据,数据会返回给调用者
            setResult(0, data);
            finish();//关闭掉当前的activity,才会返回数据
    
    3. 在开启者activity里面实现方法
            onActivityResult(int requestCode, int resultCode, Intent data) 
            通过data获取返回的数据
    4. 根据请求码和结果码确定业务逻辑

    MainActivity:

    package com.itheima.getresult;
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.Menu;
    import android.view.View;
    import android.widget.EditText;
    public class MainActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        public void click(View c){
            //跳转至选择联系人Activity
            Intent intent = new Intent(this, ContactActivity.class);
    //        startActivity(intent);
            //用这个api启动的Activity,告诉系统在ContactActivity销毁时会返回数据,系统会回调onActivityResult
            startActivityForResult(intent, 10);
        }
        
        public void click2(View v){
            //跳转至选择快捷回复的Activity
            Intent intent = new Intent(this, CallbackActivity.class);
            startActivityForResult(intent, 20);
        }
        //如果有Activity在销毁时返回了数据,那么就会调用此方法来接收数据
        //requestCode:用来区分数据来自于哪一个Activity
        //resultCode:用来区分返回的数据是什么类型的
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            String name = data.getStringExtra("name");
            if(requestCode == 10){
                EditText et = (EditText)findViewById(R.id.et);
                et.setText(name);
            }
            else if(requestCode == 20){
                EditText et_content = (EditText)findViewById(R.id.et_content);
                et_content.setText(name);
            }
        }
    }
    配置Activity
    <activity android:name="com.itheima.getresult.ContactActivity"></activity>
    <activity android:name="com.itheima.getresult.CallbackActivity"></activity>

    CallbackActivity:

    package com.itheima.getresult;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    
    public class CallbackActivity extends Activity {//显示一个列表lv
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_contact);
            ListView lv = (ListView) findViewById(R.id.lv);
            final String[] objects = new String[]{
                    "免谈,没戏,滚犊子",
                    "媳妇我错了,求原谅",
                    "老子才是一家之主"
            };
            lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item_listview, R.id.tv, objects));
            lv.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    Intent data = new Intent();
                    data.putExtra("name", objects[position]);
                    setResult(2, data);
                    finish();
                }
            });
        }
    }

    ContactActivity:

    package com.itheima.getresult;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    
    public class ContactActivity extends Activity {//显示列表lv的Activity
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_contact);
            ListView lv = (ListView) findViewById(R.id.lv);
            final String[] objects = new String[]{
                    "小志",
                    "逼哥",
                    "世界级XXX",
                    "国服第一"
            };
            lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item_listview, R.id.tv, objects));
            //给listview设置条目的点击侦听
            lv.setOnItemClickListener(new OnItemClickListener() {
                //当某个条目被点击时,此方法调用
                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    //Activity返回时传递数据,也是通过意图对象
                    Intent data = new Intent();
                    //把要传递的数据封装至意图对象中
                    data.putExtra("name", objects[position]);
                    //当前Activity销毁时,data这个意图就会传递给启动当前Activity的那个MainActivity
                    setResult(1, data);
                    //销毁当前Activity,回到上次的MainActivity,
                    finish();
                }
            });
        }
        
        @Override//点击返回键执行的操作也就是调用finish(),
        public void onBackPressed() {
            super.onBackPressed();
        }
    }

    在一些特殊的应用程序常见下,比如游戏,不希望横竖屏切换activity被销毁重新创建
    需求:禁用掉横竖屏切换的生命周期
    1. 横竖屏写死
    android:screenOrientation="landscape"
    android:screenOrientation="portrait"

    2. 让系统的环境 不再去敏感横竖屏的切换。

    android:configChanges="orientation|screenSize|keyboardHidden"

    ---

    Activity清单文件设置了Data属性则java代码里面一定要传Data,如果清单文件没有设置Data则java代码不能传Data,如果清单文件没有设置Data属性而java代码要传数据则用Intent传数据。
    清单文件会优先加载,如果在清单文件设置了横竖屏写死,而java代码设置了不写死,则java代码会覆盖清单文件,使得横竖屏不写死。
  • 相关阅读:
    后端PHP框架laravel学习踩的各种坑
    IE6、IE7兼容querySelectorAll和querySelector方法-最终版本
    package.json保存
    原生javascript兼容性总结
    原生javascript代码懒加载
    禁止选择文本样式
    xml转实体类的实现
    kendo ui editor 文本编辑器 自定义高度的实现
    setTimeout执行时带参数,并且带的是object对象类型的参数
    KendoUi listview template的用法记录
  • 原文地址:https://www.cnblogs.com/yaowen/p/4945968.html
Copyright © 2011-2022 走看看