• Activity 详解


    1、活动的生命周期

    1.1、返回栈

    Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈。栈是一种先进后出的数据结构,在默认情况下,每当我们启动了一个新的活动,他会在返回栈中入栈,并处于栈顶的位置。而每当我们按下Back键或调用finish()方法去销毁一个活动时,处于栈顶的活动就会出栈,这时前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。

    1.2.活动状态

    每个活动在其生命周期中最多可能有四种状态

    (1)运行状态

    (2)暂停状态

    当一个活动不在处于栈顶位置,但仍然可见时,这是活动就进入了暂停状态。处于暂停状态的活动仍是完全存活的。

    (3)停止状态

    (4)销毁状态

    1.3.活动的生命周期

    Activity类中定义了七个回调的方法,覆盖了活动生命周期的每一个环节。

    (1)onCreate(),他会在活动第一次被创建的时候调用,应在这个方法中完成活动的初始化操作,比如说加载布局、绑定事件等。

    (2)onStart()这个方法在活动由不可见变为可见的时候调用

    (3)onResume()这个方法在活动准备好和用户进行交互的时候调用。此是活动一定处于返回栈的栈顶,并且处于运行状态,在屏幕的最前端。

    (4)onPause()当Activity被一个透明挥着Dialog样式的Activity覆盖时的状态。此时它仍与床就管理器保持连接,系统继续维护其内部状态,所以他仍然可见,但他已失去了焦点古不可以用户交互。

    (5)onStop()这个方法在活动完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动的新活动是一个对话框是的活动,那么onPause()方法会得到执行,而onStop()方法不会执行。

    (6)onDestroy()这个方法在活动被销毁之前调用,直呼的状态将变为销毁状态。

    (7)onRestart()这个方法再哄活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。

    1.4 三种生存期

    以上七个方法除了onRestart(),其他都是两两相对的,从而又可将活动分为三种生存期。

    1.4.1完整生存期onCreate()和onDestroy()之间

    1.4.2.可见生存期onStart()和onStop()之间

    1.4.3.前台生存期onResume()和onPause()之间。

    1.5Activity的启动顺序

    onCreate()-->onStart()-->onResume()

    当另一个Activity启动时:

    第一个Activity  onPause()-->第二个Activity onStart()-->onResume()-->第一个Activity onStop()

    当返回到第一个Activity时

    第二个Activity onPause()-->第一个onRestart()-->onStart()-->onResume()-->第二个Activity onStop()-->onDestroy()

    一个Activity的销毁顺序

    (1)onPause()--><Process Killed>

    (2)onPause()-->onStop()--><Process Killed>

    (3)onPause()-->onStop()-->onDestroy()

    2、Activity传递数据

    两种方式:

    2.1直接通过Bundle对象传递

    1.传递:

    Intent intent = new Intent(MainActivity.this,OtherActivity.class);
    Bundle bundle = new Bundle();
    bundle.putBoolean("boolean_key",true);//编写内容
    bundle.putString("string_key","valueaaa);
    intent.putExtra("key",bundle);//封装
    startActivity(intent);//启动

    获取数据:

    Intent intent = getIntent();
    //注意:这里的intent和MainActivity中的intent不是一个,但他们所携带的内容是一样的
    Bundle bundle = intent.getBundleExtra("key");
    String info = bundle.getString("string_key");

    2.2直接通过Intent传递

    Intent intent = new Intent(MainActivity.this,OtherActivity.class);
    intent.putExtraBoolean("boolean_key",true);//编写内容
    intent.putExtraString("string_key","valueaaa);
    intent.putExtraInt("age",24);
    startActivity(intent);//启动

    获取:

    Intent intent = getIntent();
    //注意:这里的intent和MainActivity中的intent不是一个,但他们所携带的内容是一样的
    String info = intent.getString("string_key");
    int age = intent.getInt("age",20);

    3.Activity处理返回结果

    Android提供了一个机制,跳转到其他Activity是,再返回们可以接收到其他activity返回的值,无需再start新的当前activity。

    //启动待带回结果的Activity
    startActivityForResult(intent,0);
    //处理返回结果的方法
    public void onActivityResult(int requestCode,int resultCode,Intent data)
    
    
    //设置结果,结束Activity
    MyActivity3.this.setResult(0,intent);
    MyActivity3.this.finish();

    示例:

    点击MainActivity中的select按钮,跳转到PhoneNumberListActivity,选择列表中的数据,把值传回MainActivity中。

    MainActivity

    //select点击事件
    public void Select(View v) {
            Intent intent = new Intent(this, PhoneNumberListActivity.class);
            //intent,请求编码
            startActivityForResult(intent, REQUESTCODE_1);
        }
    
        //重写方法来处理返回的结果
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == RESULT_OK) {
                switch (requestCode) {
                    case 1:
                        etNum.setText(data.getStringExtra("number"));
    
                }
            }
        }
    PhoneNumberListActivity:
    public class PhoneNumberListActivity extends AppCompatActivity {
    
        private ListView lvPhone;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_phone_number_list);
            lvPhone = (ListView) findViewById(R.id.lvPhone);
            final String[] numbers = {"1", "2", "3"};
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                    this, android.R.layout.simple_list_item_1, android.R.id.text1, numbers);
            lvPhone.setAdapter(adapter);
            lvPhone.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    String number = numbers[i];
                    Intent intent = new Intent();
                    intent.putExtra("number", number);//设置返回结果
                    setResult(RESULT_OK, intent);
                    finish();
                }
            });
        }
    }

     4.横竖屏

    Android内设置了方向感应器的支持,Android会根据所处的方向进行横竖屏切换,但是有时我们的应用程序仅能在横屏或者书评运行,比如某些游戏,此时我们需要锁定该Activity运行时的屏幕方向,<activity>节点的android:screenOrentation属性可以完成该项任务,示例代码如下:

    <activity android:name=".Demo"
    android:screenOrientation="portrait"/>
    //竖屏,值为landscape时为横屏
    //        通过代码动态设置横竖屏
    //        横屏
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    //        竖屏
    //        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    //        全屏的Activity:要使一个Activity全屏运行,可以在其onCreate()方法中添加如下代码实现
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
            //去除标题
            requestWindowFeature(Window.FEATURE_NO_TITLE);
    //        以窗口形式显示Activity
    <activity android:name=".RecyclerActivity" 
     android:theme="@android:style/Theme.Dialog"/>

     5、Activity运行时屏幕方向与显示方式

    Activity横竖屏切换时

    /**
     * 可以通过AndroidManifest.xml中的android:configChages指定的属性发生变化时,不会去重新启动Activity,
     * 而是通知程序去调用onConfigurationChanged()函数
     * 常见的属性有:
     * keyboard  键盘发生了改变 -- 例如用户用了外部的键盘
     * keyboardHidden  键盘的可用性发生了改变
     * orientation  屏幕方向改变了
     * screenSize  屏幕大小改变了
     */

     6、Activity通过SharedPreference保存数据

    SharePreference使用xml格式为Android应用提供一种永久的数据存储方式。对于一个Android应用,它存储在文件系统的/data/data/your_app_package_name/shared_pres/目录下,可以被处在同一用用中的所有Activity访问

        private SharedPreferences sp ;
    
            //获取当前应用程序的SharePreferences对象,只有一个
            sp = getSharedPreferences("msg",Context.MODE_PRIVATE);
    
            //存储数据
            SharedPreferences.Editor editor = sp.edit();
            editor.putString("msg","aaaa0");
            //提交
            editor.commit();
    
            //移除msg内容(删除数据,文件还有)
            editor.remove("msg");
            editor.commit();
    
            //获取数据
            String s = sp.getString("msg","");
  • 相关阅读:
    手机号不能为空
    选项卡套选项卡
    可以在一个html的文件当中读取另一个html文件的内容
    价格计算
    v形 加强版
    V形
    生成100个Div
    伪元素::after和::before
    数组中的toString,toLocalString,valueOf方法有什么区别
    JavaScript toLocaleString() 方法
  • 原文地址:https://www.cnblogs.com/chhom/p/4709785.html
Copyright © 2020-2023  润新知