Android_入门_2_四大组件之Activity

1. 理论概述 

1.1  Activity的理解

Servlet的理解回顾

  • 狭义:  Servlet是一个interface, 我们的Servlet类都必须是 此接口的实现类 
  • 广义: Servlet是一种服务器端的组件, 用来处理客户端( 浏览器)提交的请求, 并返回一个响应界面

组件的特点  

  • 它的类必须实现特定接口或继承特定类 
  • 需要在配置文件中配置其全类名  Androidmanifest.xml 
  • 它的对象不是通过new来创建的, 而是系统自动创建的 
  • 它的对象具有一定的生命周期, 它的类中有对应的生命周期回调方法 

Actvity的定义  

  • Activity, 直译为活动, 它是Android定义的四大应用组件之一,也是最重要用得最多的
  • Activity用来提供一个能让用户操作并与之交互界面  
  • 一个应用有多个界面, 也就是包含多个Activity 
  • 打电话,发短信, 拍照,发邮件等功能都是通过 Activity来做的  

类比Activity与Servlet  

  Servlet Activity 
组件 服务器端组件 Android客户端组件 
规范定义的接口或类 Servlet接口 Activity类 
注册 web.xml AndroidManifest.xml 
生命周期方法 

init()    

service()          

      doGet()      

      doPost()

destory() 

onCreate()

onStart()

onResume()

……

onDestroy() 

请求的发出源 浏览器/移动设备 手机屏幕视图 

 

1.2  Intent和IntentFilter的理解

Intent的理解 

  • Intent, 直译为意图, 也就是你想要做什么或想要去哪? 
  • Intent是Activity, ServiceBroadcastReceiver这三个应用组件之间进行通信的信使 
  • 例如: 我要在Activity中启动另一个Actvity, 就必须使用 Intent 对象
  • 意图对象还可以携带数据 
  • 注意: Intent不是Android中的四大应用组件之一 

Android_入门_2_四大组件之Activity_第1张图片Intent的分类  

显式意图 : 明确指定的目标组件的意图 

  • 创建对象 : Intent(Context context, Class clazz) 
  • 何时使用 : 当操作当前自己应用的组件时使用 

隐式意图 : 没有明确指定目标组件的意图 

  • 创建对象 : Intent(String action) 
  • 何时使用 : 当操作其它应用的组件时使用 

IntentFilter的理解  

  • 在配置Activity时, 可以为Activity指定一个IntentFilter的配置 
  • 如果你的Activity希望其它应用能访问到, 需要配置 
  • 如果你想启动其它应用的界面你必须用隐式intent, 且目标界面Activty配 置了 
  • 它的作用类似于web中的为Servlet配置的 

    
    

1.3  相关API 

相关API(1) 

Intent: 意图       

  • Intent(Context packageContext, Class cls) :  用于创建显示意图对象       
  • Intent(String action): 用于创建隐式意图对象       
  • putExtra(String name, Xxx value): 保存额外数据       
  • Xxx getXxxExtra(String name): 获取额外数据       
  • setData(Uri data): 设置有特定格式的uri数据 

Activity: 活动       

  • startActivity(Intent intent): 一般启动Activity       
  • startActivityForResult(int reqCode, Intent intent): 带回调启动Activity       
  • onActivityResult(int reqCode, int resultCode, Intent data): 回调方法       
  • setResult(int resultCode, Intent data): 设置要返回的结果       
  • finish(): 结束当前Activity       
  • getIntent(): 得到启动Activity的意图 
  • sendBroadcast(Intent intent): 发送广播      
  • startService(intent): 启动服务 
     

相关API(2)  

Activity生命周期相关方法       

  • onCreate()       
  • onStart()       
  • onResume()       
  • onPause()       
  • onRestart()       
  • onStop()       
  • onDestory() 

View: 代表视图的根基类       

  • setOnClickListener(OnClickListener listener): 设置点击监听       
  • setOnLongClickListener(OnLongListener listener): 设置长按监听 

SmsManager: 发送短信的工具类       

  • static SmsManager getDefault() : 得到当前对象       
  • sendTextMessage(...): 发送短信

相关API(3) 

设置点击监听的3种方式      

方式一:  Activity中添加监听:    
view.setOnClickListener(OnClickListener);        
其中:OnClickListener是一个接口实现类的对象 

方式二:view.setOnClickListener(this);          
然后使得当前操作所在的Activity实现OnClickListener接口 

方式三:  布局添加监听:    
layout中:   android:οnclick=“方法名”  
Activity中: public void 方法名(View v) {   } 

设置长按监听  
view.setOnLongClickListener(OnLongClickListener) 


2. Activity开发 

2.1 Activity的使用 

测试用例 

Android_入门_2_四大组件之Activity_第2张图片

功能说明: 
1. 在界面1点击”一般启动”: 启动界面
2, 并显示界面1中输入的数据 2. 在界面2点击”一般返回”: 返回到界面1 
3. 在界面1点击”带回调启动”: 启动界面2, 并显示界面1中输入的数据 
4. 在界面2点击”带结果返回”: 返回到界面1, 并显示界面2中输入的数据 

编写Activity的基本步骤 

  1. 定义Activity类的子类HelloActivity 
  2. 在AndroidManifest.xml配置定义的组件 
  3. 定义布局文件activity_hello.xml 
  4. 重写Activity的onCreate(), 加载布局文件 

启动一个Activity  

一般启动  

        startActivity(Intent intent) 

带回调的启动   
        startActivityForResult(int reqCode, Intent intent)   
        onActivityResult(int reqCode, int resultCode, Intent data) 

如何携带额外数据  
        intent.putExtra(name, value)  

如何获取携带的额外数据  
        Xxx intent.getXxxExtra(name) 

如何得到启动的intent  
        Intent getIntent() 

结束一个Activity 

一般结束  
        finish() 
 带结果的结束   
        setResult(int resultCode, Intent data)  
        finish() 

启动一个Activity的流程图 

Android_入门_2_四大组件之Activity_第3张图片

代码实现: 

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
    private EditText et_main_message;
    private Button btn_main_start1;
    private Button btn_main_start2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化视图对象
        et_main_message = (EditText) findViewById(R.id.et_main_message);
        btn_main_start1 = (Button) findViewById(R.id.btn_main_start1);
        btn_main_start2 = (Button) findViewById(R.id.btn_main_start2);
        //设置点击监听
        btn_main_start1.setOnClickListener(this);
        btn_main_start2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {//v就是发生事件的视图对象(操作的)
        if(v==btn_main_start1) {
            //Toast.makeText(this, "一般启动", 0).show();
            //1). 创建Intent对象(显式)
            Intent intent = new Intent(this, SecondActivity.class);
            //2). 通过intent携带额外数据
            String message = et_main_message.getText().toString();
            intent.putExtra("MESSAGE", message);
            //3). 启动Activity
            startActivity(intent);

        } else if(v==btn_main_start2) {
            //Toast.makeText(this, "带回调启动", 0).show();

            //1). 创建Intent对象(显式)
            Intent intent = new Intent(this, SecondActivity.class);
            //2). 通过intent携带额外数据
            String message = et_main_message.getText().toString();
            intent.putExtra("MESSAGE", message);
            //3). 带回调启动Activity
            int requestCode = 2;//请求码
            startActivityForResult(intent, requestCode);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //判断code
        if(requestCode==2 && resultCode==3) {//requestCode 请求码  resultCode 结果码
            //从data中取出数据
            String result = data.getStringExtra("RESULT");
            //显示
            et_main_message.setText(result);
        }
    }
}
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
/**
 * 界面二
 *
 * @author Administrator
 */
public class SecondActivity extends Activity {
    private EditText et_second_message;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        et_second_message = findViewById(R.id.et_second_message);

        //4). 得到intent对象
        Intent intent = getIntent();
        //5). 通过intent读取额外数据
        String message = intent.getStringExtra("MESSAGE");
        //6). 显示到EditText
        et_second_message.setText(message);
    }

    public void back1(View v) {
        //关闭当前界面
        finish();
    }

    public void back2(View v) {

        //保存一个结果
        int resultCode = 3;
        //准备一个带额外数据的intent对象
        Intent data = new Intent();
        String result = et_second_message.getText().toString();
        data.putExtra("RESULT", result);
        //设置结果
        setResult(resultCode, data);

        //关闭当前界面
        finish();
    }
}

AndroidManifest.xml 




    
        
            
                
                
            
        

        
        

    

strings.xml



    L02_Activity
    Hello world!
    SecondActivity

 

 styles.xml



    
    

    
    


activity_main.xml 



    
    

    

 activity_second.xml



    
    

    

 Activity界面的四种状态 

  • 运行状态: 可见也可操作 
  • 暂停状态: 可见但不可操作 
  • 停止状态: 不可见,但对象存在 
  • 死亡状态: 对象不存在 

Activity的生命周期回调方法  

  • onCreate():activity对象被创建时调用,常用语初始化操作。如:设置布局、 初始化视图、绑定事件等
  • onStart():此时的activity还处于不可见状态 
  • onResume():此时activity处于可见状态,且一定位于返回栈的栈顶 
  • onPause():系统准备去启动或恢复另一个activity时调用,activity即将从可 见变为不可见状态,释放一些cpu资源 • onRestart():此时的activity被重新启动了 
  • onStop():activity处于完全不可见时调用 
  • onDestory():被销毁前调用,之后activity变为销毁状态 

Activity的生命周期图  

Android_入门_2_四大组件之Activity_第4张图片

测试用例  

1) 界面从“死亡”-->“运行" 
2) 界面从“运行”-->“死亡"  
3) 界面从“运行”-->“停止"
4) 界面从“停止” -->“运行"
5) 界面从“运行”-->“暂停" 
6) 界面从“暂停” -->“运行" 

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
/**
 *
 * @author Administrator
1)界面从“死亡”-->“运行"
创建对象-->onCreate()-->onStart()-->onResume()---可见可操作(运行状态)
2) 界面从“运行”-->“死亡"
onPause()-->onStop()-->onDestroy()-->Activity对象成为垃圾对象---不可见也不存在死亡状态)
3) 界面从“运行”-->“停止"
onPause()-->onStop()---不可见但存在
4) 界面从“停止” -->“运行"
onRestart()-->onStart()-->onResume()
5) 界面从“运行”-->“暂停"
onPause()
6) 界面从“暂停” -->“运行"
onResume()

重要的:
1. onCreate(): 在Activity对象创建后调用, 只执行一次
2. onDestroy(): 在Activity死亡之前调用, 只执行一次
3. onResume(): 界面只有经历此方法才能可见可操作
 */
public class MainActivity extends Activity{

    public MainActivity() {
        Log.e("TAG", "MainActivity()");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.e("TAG", "onCreate()");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        Log.e("TAG", "onStart()");
        super.onStart();
    }

    @Override
    protected void onResume() {
        Log.e("TAG", "onResume()");
        super.onResume();
    }

    @Override
    protected void onPause() {
        Log.e("TAG", "onPause()");
        super.onPause();
    }

    @Override
    protected void onStop() {
        Log.e("TAG", "onStop()");
        super.onStop();
    }

    @Override
    protected void onRestart() {
        Log.e("TAG", "onRestart()");
        super.onRestart();
    }

    @Override
    protected void onDestroy() {
        Log.e("TAG", "onDestroy()");
        super.onDestroy();
    }

    public void startSecond(View v) {
        startActivity(new Intent(this, SecondActivity.class));
    }
}
import android.app.Activity;
import android.os.Bundle;

/**
 * 界面二
 * 
 * @author Administrator
 *
 */
public class SecondActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
		
	}
}

 activity_main.xml



    
    

    

activity_second.xml



    
    


AndroidManifest.xml 




    
        
            
                

                
            
        
        
        


    

strings.xml




    L02_Life
    Hello world!
    SecondActivity


styles.xml



    
    

    
    


2.2 Activity的生命周期 

Activity生命周期与状态  

Android_入门_2_四大组件之Activity_第5张图片

2.3 Activity的TaskStack

 

  • 在Android中,系统用Task Stack (Back Stack)结构来存储管理启动的 Activity对象 
  • 一个应用启动,系统就会为其创建一个对应的Task Stack来存储并管理该应用的Activity对象 
  • 只有最上面的任务栈的栈顶的Activity才能显示在窗口中 

 Android_入门_2_四大组件之Activity_第6张图片

  • 栈:stack:先进后出
  • 队列:queue :先进先出

一个进程中的多个Activity是以栈的方式存储的 

Android_入门_2_四大组件之Activity_第7张图片

2.4 Activity的launchMode 

说明 

在Android中, 启动一个Activity有时需要创建一个新对象, 有时需要复用已有的对象, 可以通过在配置activity时通过launchMode属性指定。

launchMode属性值(4个)为: 

  • standard:  标准模式,每次调用startActivity()方法就会产生一个新的实例。 这是默认的模式 
  • singleTop:  如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例; 如果不位于栈顶,会产生一个新的实例。 
  • singleTask:  只有一个实例, 默认在当前Task中 
  • singleInstance:  只有一个实例, 创建时会新建一个栈, 且此栈中不能有其它对象 

测试用例  

Android_入门_2_四大组件之Activity_第8张图片

 Android_入门_2_四大组件之Activity_第9张图片

Android_入门_2_四大组件之Activity_第10张图片

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

/**
 * 
 */
public class MainActivity extends Activity{

	public MainActivity() {
		Log.e("TAG", "MainActivity()");
	}
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		Log.e("TAG", "onCreate()");
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	

	public void startSecond(View v) {
		startActivity(new Intent(this, SecondActivity.class));
	}
	
	public void startFrist(View v) {
		startActivity(new Intent(this, MainActivity.class));
	}
}
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

/**
 * 界面二
 * 
 * @author Administrator
 *
 */
public class SecondActivity extends Activity {

	public SecondActivity() {
		Log.e("TAG", "SecondActivity()");
	}
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
	}
	
	public void startFrist(View v) {
		startActivity(new Intent(this, MainActivity.class));
	}
	
	public void startThird(View v) {
		startActivity(new Intent(this, ThirdActivity.class));
	}
}
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class ThirdActivity extends Activity {

	public ThirdActivity() {
		Log.e("TAG", "ThirdActivity()");
	}
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_third);
	}
}

 activity_main.xml



    
    

    

activity_second.xml



    
    

    

 activity_third.xml



    


 AndroidManifest.xml




    
        
            
                
                
            
        
        
        
        
    

strings.xml 




    l02_lauchmode
    Hello world!
    SecondActivity
    ThirdActivity


styles.xml 



    
    

    
    



3. 功能练习 

3.1 打电话与发短信 

Android_入门_2_四大组件之Activity_第11张图片

功能描述: 
1) 点击”打电话”: 进入拨号界面 
2) 长按”打电话”: 直接拨打电话 
3) 点击”发短信”: 进入编辑短信界面 
4) 长按”发短信”: 直接将短信发送出去 
 
技术点:  
1). 布局的设计           
2). 点击事件和长按事件监听的添加 
3). 使用隐式意图拨打电话,进入拨号界面, 进入发短信界面: 
4). 使用SmsMessager发送短信 
5). 权限的声明(如打电话, 发短信) 

相关API 

  • 进入电话拨打界面的意图: Intent.ACTION_DIAL 
  • 进入短信编辑界面的意图: Intent.ACTION_SENDTO 
  • 拨打电话的意图 : Intent.ACTION_CALL 
  • 发送短信的工具类 : SmsManager 

需要的权限:     





拨打电话的 Uri: tel:110 
进入短信界面的电话 Uri : smsto:110 
携带额外短信数据的标识名为 : sms_body


如何利用Log和系统应用源码来确定意图的action? 

添加ActivityManager 的Log日志利用系统应用源码找到对应的Activity的配置

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements OnLongClickListener {

    private EditText et_main_number;
    private EditText et_main_sms;
    private Button btn_main_call;
    private Button btn_main_send;
    private OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(v==btn_main_call) {//点击打电话
                //Toast.makeText(MainActivity.this, "点击打电话", 0).show();

                //1). 创建一个Intent(隐式)
                //08-28 03:27:09.976: I/ActivityManager(1222): Displayed com.android.dialer/.DialtactsActivity: +535ms
                String action = "android.intent.action.DIAL";
                action = Intent.ACTION_DIAL;//一样的
                Intent intent = new Intent(action);
                //2). 携带数据
                String number = et_main_number.getText().toString();
                intent.setData(Uri.parse("tel:"+number)); //
                //3). startActivity(intent)
                startActivity(intent);
            }else if(v==btn_main_send) {//点击发短信
                Toast.makeText(MainActivity.this, "点击发短信", 0).show();
                //1). 创建一个Intent(隐式)
                //08-28 04:00:02.420: I/ActivityManager(1222): Displayed com.android.mms/.ui.ComposeMessageActivity: +132ms
                Intent intent = new Intent(Intent.ACTION_SENDTO);//android.intent.action.SENDTO
                //2). 携带数据(号码/内容)
                String number = et_main_number.getText().toString();
                String sms = et_main_sms.getText().toString();
                intent.setData(Uri.parse("smsto:"+number));
                //携带额外数据
                intent.putExtra("sms_body", sms);
                //3). startActivity(intent)
                startActivity(intent);
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化视图对象
        et_main_number = (EditText) findViewById(R.id.et_main_number);
        et_main_sms = (EditText) findViewById(R.id.et_main_sms);
        btn_main_call = (Button) findViewById(R.id.btn_main_call);
        btn_main_send = (Button) findViewById(R.id.btn_main_send);
        //给视图对象设置点击监听
        btn_main_call.setOnClickListener(onClickListener);
        btn_main_send.setOnClickListener(onClickListener);
        //给视图对象设置长按监听
        btn_main_call.setOnLongClickListener(this);
        btn_main_send.setOnLongClickListener(this);
    }

    @Override
    public boolean onLongClick(View v) {
        if(v==btn_main_call) {//长按打电话
            //Toast.makeText(MainActivity.this, "长按打电话", 0).show();
            //1). 创建一个Intent(隐式)
            //08-28 03:38:59.717: I/ActivityManager(1222): Displayed com.android.phone/.PrivilegedOutgoingCallBroadcaster: +570ms
            Intent intent = new Intent(Intent.ACTION_CALL);//android.intent.action.CALL
            //2). 携带数据
            String number = et_main_number.getText().toString();
            intent.setData(Uri.parse("tel:"+number));
            //3). startActivity(intent)
            startActivity(intent);

        }else if(v==btn_main_send) {//长按发短信
            Toast.makeText(MainActivity.this, "长按发短信", 0).show();

            //1). 得到SmsManager的对象
            SmsManager smsManager = SmsManager.getDefault();
            //2). 发送文本信息(短信)
            String number = et_main_number.getText().toString();
            String sms = et_main_sms.getText().toString();
            smsManager.sendTextMessage(number, null, sms, null, null);
        }
        return true;//不会再触发点击事件(表示此事件已经被消费了)
    }
}

activity_main.xml 



    

        

        
        
    

    

        

        
        
    


    

        

 AndroidManifest.xml





    
    
    
    

    
        
            
                
                
            
        
    

strings.xml 




    App02_Activity
    Hello world!


styles.xml



    
    

    
    


 

你可能感兴趣的:(Android)