Activity详解

  • 什么是Activity
    • Android提供的四大组件(activity、service、contentprovider、broadcast receiver)之一。它是一个界面的载体(内含各种控件),不妨理解为web开发中的html文件(含各种标签)。当然,Activity远远没有这么简单,不妨看一下源代码。作为一个继承的类,它的源码达到了7000行,这是由于Activity封装了很多方法给开发者使用。当然,初学者不需要知道这些底层的东西。
  • Activity的生命周期
    • 这是官方参考文档里的图。
    • 不难看出,当这个activity第一次创建出现时是oncreate方法调用了,直到这个Activity被销毁。当然,我们一般大量的刷新类型的业务处理是放在onresume这个方法实现。(因为create只会在activity创建时调用一次,除非销毁才会再次调用,这是开销比较大的,一般不这么做)
  • 下面代码尝试调用所有的方法,明确生命周期。
    • 代码测试
      •   package com.zc.helloworld;
          
          import android.content.Context;
          import android.support.v7.app.AppCompatActivity;
          import android.os.Bundle;
          import android.util.Log;
          import android.widget.Button;
          
          
          
          public class MainActivity extends AppCompatActivity {
          
              private Button btn;
              private Context context;
          
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_main);
                  Log.e("info","MainActivity onCreate()");
              }
              @Override
              protected void onStart() {
                  super.onStart();
                  Log.e("info","MainActivity onStart()");
              }
          
              @Override
              protected void onResume() {
                  super.onResume();
                  Log.e("info","MainActivity onResume()");
              }
          
              @Override
              protected void onPause() {
                  super.onPause();
                  Log.e("info", "MainActivity onPause()");
              }
          
              @Override
              protected void onStop() {
                  super.onStop();
                  Log.e("info", "MainActivity onStop()");
              }
          
              @Override
              protected void onDestroy() {
                  super.onDestroy();
                  Log.e("info","MainActivity onDestroy()");
              }
          
          
              @Override
              protected void onRestart() {
                  super.onRestart();
                  Log.e("info","MainActivity onRestart()");
              }
          
          
          }
        
    • 演示结果
      • 当初次打开App时
      • 当home键最小化App时
      • 当回到未被后台销毁的APP时
      • 当退出且关闭App时
      • 从上面的情况,不难看出生命周期的运转过程。
  • 常用的Activity
    • 在开发中,不可避免要写很多的Activity,但是为了方便,谷歌已经封装了很多实用的牵涉底层的Activity。
    • 代码测试
      •   package com.zc.helloworld;
          
          import android.content.Context;
          import android.content.Intent;
          import android.net.Uri;
          import android.support.v7.app.AppCompatActivity;
          import android.os.Bundle;
          import android.util.Log;
          import android.view.View;
          import android.widget.Button;
          
          
          
          public class MainActivity extends AppCompatActivity {
          
              private Button btn1,btn2,btn3,btn4;
              private Context context;
          
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_main);
                  btn1 = (Button) findViewById(R.id.btn1);
                  btn2 = (Button) findViewById(R.id.btn2);
                  btn3 = (Button) findViewById(R.id.btn3);
                  btn4 = (Button) findViewById(R.id.btn4);
                  context = this;
                  btn1.setOnClickListener(new View.OnClickListener(){
                      @Override
                      public void onClick(View v) {
                          Intent intent = new Intent();
                          intent.setAction(Intent.ACTION_VIEW);
                          intent.setData(Uri.parse("http://www.baidu.com"));
                          startActivity(intent);
                      }});
                  btn2.setOnClickListener(new View.OnClickListener(){
                      @Override
                      public void onClick(View v) {
                          Intent intent = new Intent();
                          intent.setAction(Intent.ACTION_GET_CONTENT);
                          intent.setType("image/*");
                          startActivity(intent);
                      }});
                  btn3.setOnClickListener(new View.OnClickListener(){
                      @Override
                      public void onClick(View v) {
                          Intent intent = new Intent();
                          intent.setAction(Intent.ACTION_SEND);
                          intent.setType("text/plain");
                          intent.putExtra(Intent.EXTRA_TEXT,"Hello World!");
                          startActivity(intent);
                      }});
                  btn4.setOnClickListener(new View.OnClickListener(){
                      @Override
                      public void onClick(View v) {
                          Intent intent = new Intent();
                          intent.setAction(Intent.ACTION_VIEW);
                          intent.setData(Uri.parse("tel:10086"));
                          startActivity(intent);
                      }});
              }
          
          }
        
    • 演示结果
  • Activity之间的数据交互
    • 一般用intent传递。(内存数据)
    • 代码测试
      • MainActivity.java(将这个Activity的textview数据传到下一个Activity)
        •   package com.zc.helloworld;
            
            import android.content.Context;
            import android.content.Intent;
            import android.net.Uri;
            import android.support.v7.app.AppCompatActivity;
            import android.os.Bundle;
            import android.util.Log;
            import android.view.View;
            import android.widget.Button;
            import android.widget.TextView;
            
            
            public class MainActivity extends AppCompatActivity {
            
                private Button btn1;
                private TextView tv;
                private Context context;
            
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);
                    context = this;
                    btn1 = (Button) findViewById(R.id.btn1);
                    tv = (TextView) findViewById(R.id.tv1);
                    btn1.setOnClickListener(new View.OnClickListener(){
                        @Override
                        public void onClick(View v) {
                            Intent intent = new Intent(context,Main2Activity.class);
                            String data = (String) tv.getText();
                            intent.putExtra("data",data);
                            startActivity(intent);
            
                        }});
                }
            
            
            
            
            }
          
      • MainActivity2.java
        •   package com.zc.helloworld;
            
            import android.content.Intent;
            import android.support.v7.app.AppCompatActivity;
            import android.os.Bundle;
            import android.widget.TextView;
            
            public class Main2Activity extends AppCompatActivity {
                private TextView tv;
            
            
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main2);
                    tv = (TextView) findViewById(R.id.tv2);
                    Intent intent = getIntent();
                    if(intent!=null){
                        String data = intent.getStringExtra("data");
                        tv.setText(data);
            
                    }
                }
            }
          
    • 演示结果
      • 当然,更多类型,更加复杂的数据可以用Bundle绑定一起传递。
  • 补充说明
    • 实际开发中必须要处理好Activity和Context的关联。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐