02_四大应用组件之Activity

1 Activity理解

1.1 组件的特点

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

1.2 Actvity的定义

Activity用来提供一个能让用户操作并与之交互的界面。
一个应用有多个界面, 也就是包含多个Activity。

1.3 Activity和servlet的对比

在这里插入图片描述

1.4 Intent和IntentFilter的理解

1.4.1 Intent的理解

在这里插入图片描述

1.4.2 Intent的分类

在这里插入图片描述

1.4.3 IntentFilter的理解

在这里插入图片描述

1.5 相关API

在这里插入图片描述在这里插入图片描述在这里插入图片描述

1.6 案例

1.6.1 案例说明

在这里插入图片描述

1.6.2 项目

在这里插入图片描述
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/editText_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" 
		android:hint="@string/texthit">
        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/button01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button01" />

    <Button
        android:id="@+id/button02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button02" />

</LinearLayout>

activity_second.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/editText_second"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" 
        android:hint="@string/secondActivity_param">

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/returnButton01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/secondActivity_button01" 
        android:onClick="back1"/>

    <Button
        android:id="@+id/returnButton02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/secondActivity_button02" 
		 android:onClick="back2"/>

</LinearLayout>

参数设置
在这里插入图片描述MainActivity.java

package com.shenju.test002;

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;

public class MainActivity extends Activity implements OnClickListener{

	private EditText editText_main;
	private Button button01;
	private Button button02;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//获取元素对象
		editText_main = (EditText) findViewById(R.id.editText_main);
		button01 = (Button) findViewById(R.id.button01);
		button02=(Button) findViewById(R.id.button02);
		
		//设置监听 this指的是当前方法所在类的类型 ----MainActivity对象
		button01.setOnClickListener(this);
		button02.setOnClickListener(this);
	}

	/**
	 * View对象就是监听的对象 比如button01 button02
	 */
	@Override
	public void onClick(View v) {
		
		if(v==button01){
			
			//创建显式的Intent对象
			Intent intent=new Intent(this,SecondActivity.class);
			//携带参数
			String message=editText_main.getText().toString();
			intent.putExtra("message", message);
			//启动activity
			startActivity(intent);

		}else if(v==button02){
			
			//带回调的启动
			//显式创建Intent
			Intent intent =new Intent(this, SecondActivity.class);
			editText_main=(EditText) editText_main.findViewById(R.id.editText_main);
			String message=editText_main.getText().toString();
			intent.putExtra("message", message);
			//请求编码随便设置
			int requestCode=1;
			//带回调的启动
			startActivityForResult(intent, requestCode);
			
			
		}
		
	}
	/**
	 * 回调方法
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		
		//判断requestCode和resultCode
		if(requestCode==1&&resultCode==2){
			//获取值
			String message=data.getStringExtra("message");
			//设置值
			editText_main=(EditText) editText_main.findViewById(R.id.editText_main);
			editText_main.setText(message);
		}
	}
}

SecondActivity.java

扫描二维码关注公众号,回复: 8794389 查看本文章
package com.shenju.test002;

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;

public class SecondActivity extends Activity{

	
	private EditText editText_second;
	private Button returnButton01;
	private Button returnButton02;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
		
		editText_second=(EditText) findViewById(R.id.editText_second);
		//得到intent对象
		Intent intent= getIntent();
		//获取message
		String message=intent.getStringExtra("message");
		//显示message
		editText_second.setText(message);
		
		returnButton01=(Button) findViewById(R.id.returnButton01);
	}

	public void back1(View v) {
		
		finish();
	}
	
	
	public void back2(View v) {
		
		//获取值
		editText_second=(EditText) editText_second.findViewById(R.id.editText_second);
		String message=editText_second.getText().toString();
		//设置intent 传递数据
		Intent intent=new Intent();
		intent.putExtra("message", message);
		//设置结果编码
		int resultCode=2;
		//设置值
		setResult(resultCode, intent);
		//关闭当前界面返回上一个界面
		finish();
	}
}

注意:
设置监听有四种方式
第一种:

 //给button设置点击监听
        btn_main_download.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//点击要执行的代码
				//1 提示开始下载的文本小提示
				//如何得到外部类对象,外部类名.this
				//Toast提示小文本类
				Toast.makeText(MainActivity.this, "开始下载...",Toast.LENGTH_SHORT).show();
				//更新button文本
				btn_main_download.setText("正在下载中...");
			}
		}); 
    }

第二种:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

第三种:
在这里插入图片描述
在这里插入图片描述第四种:
在这里插入图片描述

2 Activity的使用

2.1 启动一个Activity

在这里插入图片描述在这里插入图片描述在这里插入图片描述从上图我们可以得知:每一个activity的启动,并不是我们自己进行启动,而是通过activityManager来进行启动。

2.2 Activity的生命周期

2.2.1 Activity界面的四种状态

在这里插入图片描述

2.2.2 Activity的生命周期回调方法

在这里插入图片描述

2.2.3 Activity的生命周期图

在这里插入图片描述

2.2.4Activity生命周期与状态

在这里插入图片描述
在这里插入图片描述

3 Activity的TaskStack(任务栈)和launchMode(加载模式)

3.1 TaskStack说明

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

3.2 launchMode说明

  • 在Android中, 启动一个Activity有时需要总是创建一个新对象, 有时需要复用已有的对象, 可以通过在配置activity时通过launchMode属性指定。
  • launchMode属性值(4个)为:
    standard:
    标准模式,每次调用startActivity()方法就会产生一个新的实例。
    singleTop:
    如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例;如果不位于栈顶,会产生一个新的实例。
    singleTask:
    只有一个实例, 默认在当前Task中。
    singleInstance:
    只有一个实例, 创建时会新建一个栈, 且此栈中不能有其它对象。

4 应用练习

4.1 说明

在这里插入图片描述

4.2 代码

项目结构
在这里插入图片描述
界面布局
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="电话号码:" />

        <EditText
            android:id="@+id/et_main_number"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10" 
            android:hint="请输入号码">

            <requestFocus />
        </EditText>

    </LinearLayout>
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="短信内容:" />

        <EditText
            android:id="@+id/et_main_sms"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10" 
            android:hint="请输入短信">

            <requestFocus />
        </EditText>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/btn_call"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="打电话" />

        <Button
            android:id="@+id/btn_send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="发短信" />

    </LinearLayout>

</LinearLayout>

MainActivity.java

package com.shenju.test003;

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_call;
	private Button btn_send;
	
	private OnClickListener onClickListener=new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			
			if(v==btn_call){
				
				//注意如果写this的话不行 因为该方法在OnClickListener类中 而不是MainActivity中
				Toast.makeText(MainActivity.this,"点击打电话",0).show();
				String number=et_main_number.getText().toString();
				//创建一个隐式的Intent
				String action=Intent.ACTION_DIAL;
				Intent intent=new Intent(action);
				//携带数据
				intent.setData(Uri.parse("tel:"+number));
				//启动activity
				startActivity(intent);
				
				
			}else if(v==btn_send){
	
				Toast.makeText(MainActivity.this,"点击发短信",0).show();
				//获取号码和内容
				et_main_number= (EditText) et_main_number.findViewById(R.id.et_main_number);
				et_main_sms=(EditText) et_main_sms.findViewById(R.id.et_main_sms);
				String number =et_main_number.getText().toString();
				String sms=et_main_sms.getText().toString();
				//创建隐式的Intent,并设置号码和短信内容
				Intent intent=new Intent(Intent.ACTION_SENDTO);
				intent.setData(Uri.parse("smsto:"+number));
				intent.putExtra("sms_body", sms);
				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_call= (Button) findViewById(R.id.btn_call);
		btn_send=(Button) findViewById(R.id.btn_send);
		//给视图对象设置点击监听
		btn_call.setOnClickListener(onClickListener);
		btn_send.setOnClickListener(onClickListener);
		//设置长按监听
		btn_call.setOnLongClickListener(this);
		btn_send.setOnLongClickListener(this);
	}

	@Override
	public boolean onLongClick(View v) {
		
		if(v==btn_call){
			
			
			Toast.makeText(MainActivity.this,"长按打电话",0).show();
			Intent intent=new Intent(Intent.ACTION_CALL);
			et_main_number=(EditText) et_main_number.findViewById(R.id.et_main_number);
			String number = et_main_number.getText().toString();
			intent.setData(Uri.parse("tel:"+number));
			startActivity(intent);
			
		}else if(v==btn_send){
			
			Toast.makeText(MainActivity.this,"长按发短信",0).show();
			//首先获取数据
			et_main_number=(EditText) et_main_number.findViewById(R.id.et_main_number);
			et_main_sms=(EditText) et_main_sms.findViewById(R.id.et_main_sms);
			String number=et_main_number.getText().toString();
			String sms=et_main_sms.getText().toString();
			
			SmsManager smsManager=SmsManager.getDefault();
			smsManager.sendTextMessage(number, null, sms, null, null);
			
		}
		
		return true;//true表示此事件已经被消费了,不会再触发点击事件
	}

	
}

AndroidManifest.xml
重点是权限设置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.shenju.test003"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="18"
        android:targetSdkVersion="18" />
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".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>
    </application>

</manifest>

发布了157 篇原创文章 · 获赞 77 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/wu2374633583/article/details/89217343