其他分享
首页 > 其他分享> > Android快速入门(二)四大应用组件之一Activity(打电话和发短信)功能练习

Android快速入门(二)四大应用组件之一Activity(打电话和发短信)功能练习

作者:互联网

一、理论概述

1、Activity的理解

(1)组件的特点:
(2)Activity的定义
(3)类比Activity与Servlet

在这里插入图片描述

2、Intent和IntentFilter的理解

Intent
(1)Intent的理解
(2)Intent的分类

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

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

IntentFilter
IntentFilter的理解

IntentFilter意图过滤器
在这里插入图片描述

3、相关API

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

二、Activity的开发

1、Activity的使用

测试
在这里插入图片描述

(1)创建项目工程

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

(2)界面布局

在这里插入图片描述

<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/et_main_message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:hint="请输入您的信息"
         >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/btn_main_start1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="一般启动" />

    <Button
        android:id="@+id/btn_main_start2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="带回调启动" />

</LinearLayout>
(3)实现Activity的功能:设计第一个界面
1)定义所有需要操作的视图对象,并初始化
2)给视图设置监听
3)在回调方法当中实现逻辑
package com.itzheng.lo2_activity;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
/*
 * 1、布局界面
 * 2、实现Activity的功能
 * 1)定义所有需要操作的视图对象并初始化
 * 2)给视图设置监听
 * 3)在回调方法当中实现逻辑
 */
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();
		}else if(v==btn_main_start2){
			Toast.makeText(this, "带回调的启动", 0).show();
		}
	}
}
(4)实现Activity的功能:设计第二个界面(实现一般启动)
1)定义好界面二

a、布局
b、定义Activity类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
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/et_second_message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:hint="请输入您的信息"
         >

        <requestFocus />
    </EditText>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="一般返回" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="带结果返回" />

</LinearLayout>

c、配置好
d、重写onCreate(),方法并加载布局
在这里插入图片描述

package com.itzheng.lo2_activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class SecondActivity extends Activity {

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

AndroidManifest.xml当中
在这里插入图片描述

<activity android:name="com.itzheng.lo2_activity.SecondActivity" android:label="@string/title_activity_second">
 </activity>
2)启动界面二

在MainActivity当中
1)创建Intent对象(显示)
2)通过intent额外携带数据
3)启动Activity

package com.itzheng.lo2_activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
/*
 * 1、布局界面
 * 2、实现Activity的功能
 * 1)定义所有需要操作的视图对象并初始化
 * 2)给视图设置监听
 * 3)在回调方法当中实现逻辑
 */
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();
			//创建Intent对象(显示)
			Intent intent = new Intent(this, SecondActivity.class);
			//通过intent额外携带数据
			String message = et_main_message.getText().toString();
			intent.putExtra("MESSAGE",message);
			//启动Activity
			startActivity(intent);
			
		}else if(v==btn_main_start2){
			Toast.makeText(this, "带回调的启动", 0).show();
		}
		
	}
}

在SecondActivity当中
1)得到intent对象
2)通过intent对象读取额外数据
3)显示到EditText当中

package com.itzheng.lo2_activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;

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 = (EditText) findViewById(R.id.et_second_message);
		
		//得到Intent对象
		Intent intent = getIntent();
		//通过intent读取额外数据
		String message = intent.getStringExtra("MESSAGE");
		//显示到EditText
		et_second_message.setText(message);
		
		
	}
}

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

3)实现一般返回

a、在显示Second界面的时候,Main界面其实还在,只是被覆盖了
b、关闭当前界面(回到上一个界面):finish()
修改activity_second.xml
在这里插入图片描述
修改SecondActivity类
在这里插入图片描述

4)实现带回调的启动与结果返回

在MainActivity当中
在这里插入图片描述

else if (v == btn_main_start2) {
			Toast.makeText(this, "带回调的启动", 0).show();
			// 创建Intent对象(显示)
			Intent intent = new Intent(this, SecondActivity.class);
			// 通过intent额外携带数据
			String message = et_main_message.getText().toString();
			intent.putExtra("MESSAGE", message);
			// 带回调启动Activity
			int requestCode = 2;// 请求码
			startActivityForResult(intent, requestCode);
		}

	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		// 判断code
		if (requestCode == 2 && resultCode == 3) {
			// 从data当中取出数据
			String result = data.getStringExtra("RESULT");
			// 显示出来
			et_main_message.setText(result);
		}

	}

在SecondActivity
在这里插入图片描述

public void back2(View v){
		//保存结果,准备一个带额外数据的intent对象
		Intent data = new Intent();
		data.putExtra("RESULT", et_second_message.getText().toString());
		int resultCode = 3;//结果码
		//设置返回的结果
		setResult(resultCode,data);
		//关闭当前界面
		finish();
	}

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

在这里插入图片描述

(5)启动一个Activity的流程图

在这里插入图片描述

2、Activity的生命周期

(1)安卓界面的四种状态

在这里插入图片描述

(2)Activity的方法

在这里插入图片描述

(3)测试应用理解上诉方法

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

/*
 * 1)界面从“死亡”--->“运行”
 * 2)界面从“运行”--->“死亡”
 * 3)界面从“运行”--->“停止”
 * 4)界面从“停止”--->“运行”
 * 5)界面从“运行”--->“暂停”
 * 6)界面从“暂停”--->“运行”
 */
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 onDestroy() {
		Log.e("TAG", "onDestroy()");
		super.onDestroy();
	}
	
	@Override
	protected void onRestart() {
		Log.e("TAG", "onRestart()");
		super.onRestart();
	}
	
}

在这里插入图片描述
在这里插入图片描述
暂停–>停止

<Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="启动界面二" 
        android:onClick="startSecond"
        />

b.在MainActivity类当中添加方法
在这里插入图片描述

public void startSecond(View v){
		startActivity(new Intent(this,SecondActivity.class));
	}

c.创建SecondActivity类
在这里插入图片描述
d.修改activity_second.xml
在这里插入图片描述

e.修改AndroidManifest.xml
在这里插入图片描述
f.运行
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
暂停

3、Activity的TaskStack

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

4、Activity的launchMode

在这里插入图片描述

5、通过创建一个工程来掌握上诉的方法以及内容

创建MainActivity,SecondActivity,
ThreeActivity以及对应的布局文件activity_main.xml,activity_second.xml,activity_three.xml

(1)standard模式

在这里插入图片描述

MainActivity
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 startFirst(View v) {
		startActivity(new Intent(this, MainActivity.class));
	}
}
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" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="界面1111111111" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动界面2"
        android:onClick="startSecond" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动界面1"
         android:onClick="startFirst" />

</LinearLayout>
SecondActivity

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 startThree(View v) {
		startActivity(new Intent(this, ThreeActivity.class));
	}
	public void startFirst(View v) {
		startActivity(new Intent(this, MainActivity.class));
	}
}
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" >
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="界面22222222222" />
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动界面3"
        android:onClick="startThree" />
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动界面1"
         android:onClick="startFirst" />

</LinearLayout>
ThreeActivity
public class ThreeActivity extends Activity {
	
	public ThreeActivity(){
		Log.e("TAG", "ThreeActivity()");
	}
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_three);
	}
}
activity_three.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="界面3333" />
</RelativeLayout>
测试

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

运行结果

在这里插入图片描述

(2)singleTop(顶部单例)模式
修改AndroidManifest.xml
android:launchMode="singleTop"

在这里插入图片描述
启动界面后在主界面上点击启动界面1没有反应,在界面2 点击启动界面1的时候,会重新创建一个界面1

(3)singleTask模式

在这里插入图片描述
无论在什么位置点击启动界面1只会创建一个界面1,将界面2销毁了

(4)singleInstance在这里插入图片描述

点击界面2,启动界面2,点击界面3,启动界面3,点击返回则启动界面1,点击返回启动界面2
设置singleInstance的界面会新栈,之前创建的栈当中没有界面2,只有界面3和界面1

总结

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

三、功能练习

1、打电话和发短信(工程搭建以及界面布局)

在这里插入图片描述

(1)创建App02_Activity

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

(2)界面布局

1)分析界面结构:垂直的LinearLayout(内水平的LinearLayout)
2)编写代码:

<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:hint="请输入号码">
        </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:hint="请输入短信">
        </EditText>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
        <Button
            android:id="@+id/btn_main_call"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="打电话" />
        <Button
            android:id="@+id/btn_main_send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="发短信" />
    </LinearLayout>
</LinearLayout>

在这里插入图片描述

(3)在Activity当中初始化需要操作的视图对象

MainActivity

package com.itzheng.app02_activity;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
	private EditText et_main_number;
	private EditText et_main_sms;
	private Button btn_main_call;
	private Button btn_main_send;
	@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);
	}
}
(4)给视图当中的button设置点击监听 ,给视图当中button设置长按监听

在这里插入图片描述

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();
			} else if (v == btn_main_send) {// 点击发短信
				Toast.makeText(MainActivity.this, "点击发短信", 0).show();
			}
		}
	};
	@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(this, "长按打电话", 0).show();
		} else if (v == btn_main_send) {// 长按发短信
			Toast.makeText(this, "长按发短信", 0).show();
		}
		return true;
	}
}

2、实现打电话

(1)实现点击打电话,进入拨打的界面:修改MainActivity的onClick

a、创建一个Intent(隐式);
b、携带数据
c、startActivity(intent);
在模拟器当中启动电话,观察LogCat当中的ActivityManger对应的内容
在这里插入图片描述

@Override
		public void onClick(View v) {
			if (v == btn_main_call) {// 点击的是打电话
				// Toast.makeText(MainActivity.this, "点击打电话", 0).show();
				// a、创建一个Intent(隐式);
				String action = "android.intent.action.DIAL";
				action = Intent.ACTION_DIAL;// 和上面的android.intent.action.DIAL一样
				Intent intent = new Intent(action);
				// b、携带数据
				String number = et_main_number.getEditableText().toString();
				intent.setData(Uri.parse("tel:" + number));//tel:固定前缀 <data-android:scheme="tel">
				// c、startActivity(intent);
				startActivity(intent);
			} else if (v == btn_main_send) {// 点击发短信
				Toast.makeText(MainActivity.this, "点击发短信", 0).show();
			}
		}

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

(2)长按“打电话”:直接进入拨打电话界面修改MainActivity的onLongClick

a、创建一个Intent(隐式);
b、携带数据
c、startActivity(intent);
在这里插入图片描述
在这里插入图片描述

@Override
	public boolean onLongClick(View v) {
		if (v == btn_main_call) {// 长按打电话
			//Toast.makeText(this, "长按打电话", 0).show();
			//a、创建一个Intent(隐式);
			Intent intent = new Intent(Intent.ACTION_CALL);//android.intent.action.CALL
			//b、携带数据
			String number = et_main_number.getEditableText().toString();
			intent.setData(Uri.parse("tel:"+number));
			//c、startActivity(intent);
			startActivity(intent);
		} else if (v == btn_main_send) {// 长按发短信
			Toast.makeText(this, "长按发短信", 0).show();
		}
		return true;// 表示此事件已经被消费了,不会再触发点击事件
	}

直接运行会抛出异常,权限被拒绝
在这里插入图片描述

(3)添加权限

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

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

(4)测试运行

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

3、实现发短信

(1)实现单击进入短信编辑界面

a、创建一个Intent(隐式);
b、携带数据
c、startActivity(intent);
在这里插入图片描述

//Toast.makeText(MainActivity.this, "点击发短信", 0).show();
				//a、创建一个Intent(隐式);
				Intent intent = new Intent(Intent.ACTION_SENDTO);//android.intent.action.SENDTO
				//b、携带数据(号码/内容)
				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);//携带额外数据
				//c、startActivity(intent);
				startActivity(intent);

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

(2)实现长按直接发送短信

需要创建另外一个模拟器
在这里插入图片描述
在这里插入图片描述
a、得到SmsManager对象
b、发送文本信息(短信)
在这里插入图片描述

else if (v == btn_main_send) {// 长按发短信
			Toast.makeText(this, "长按发短信", 0).show();
			//a、得到SmsManager对象
			SmsManager manager = SmsManager.getDefault();
			//b、发送文本信息(短信)
			String number = et_main_number.getText().toString();
			String sms = et_main_sms.getText().toString();
			manager.sendTextMessage(number, null, sms, null, null);
			
		}

运行的时候选择5556
在这里插入图片描述
直接发送会报错,权限不足,添加发短信的权限
在这里插入图片描述

<!-- 发短信的权限 -->
    <uses-permission android:name="android.permission.SEND_SMS"/>

5556发送短信
在这里插入图片描述
5554接收到短信
在这里插入图片描述

标签:btn,界面,Intent,Activity,发短信,Android,main,android
来源: https://blog.csdn.net/qq_44757034/article/details/111649778