请选择 进入手机版 | 继续访问电脑版

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

[复制链接]
阿峻 发表于 2021-1-2 12:13:29 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
一、理论概述

1、Activity的明白

(1)组件的特点:



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



  • Activity,直接翻译为运动,它是Android界说的四大应用组件之一,它也是最重要的用的最多的
  • Activity用来提供一个能让用户使用并与之交互的界面
  • 一个应用有多个用户界面,也就是包罗多个Activity
  • 打电话,发短信,照相,发邮件等功能都是通过Activity来做的
(3)类比Activity与Servlet


2、Intent和IntentFilter的明白

Intent

(1)Intent的明白



  • Intent,直译为意图,也就是你想要做什么事情,大概想去那里?
  • Intent是Activity,Service和BoradcastReceiver这三个应用组件之间举行通信的信者
  • 比方:我要在Activity中启动别的一个Activity,就必须使用Intent对象
  • 意图对象还可以携带数据
  • 注意:Intent不是Android中的四大应用组件之一
(2)Intent的分类

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


  • 创建对象:Intent(Context context,Class clazz)
  • 何时使用:当使用当前自己应用的组件时使用
隐式意图:没有明确指定目标组件的意图


  • 创建对象::Intent(String action)
  • 何时使用:当使用其他应用的组件时候使用
IntentFilter

IntentFilter的明白

IntentFilter意图过滤器

3、相关API




二、Activity的开发

1、Activity的使用

测试

(1)创建项目工程







(2)界面布局


  1.                         
复制代码
(3)实现Activity的功能:设计第一个界面

1)界说所有需要使用的视图对象,并初始化

2)给视图设置监听

3)在回调方法当中实现逻辑

  1. 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
  1.                         
复制代码
c、设置好
d、重写onCreate(),方法并加载布局

  1. 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当中

复制代码
2)启动界面二

在MainActivity当中
1)创建Intent对象(显示)
2)通过intent额外携带数据
3)启动Activity
  1. 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当中
  1. 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当中

  1. 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

  1. 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. /* * 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();        }        }
复制代码


  • 1)界面从“死亡”—>“运行”:将步调运行即可

    创建对象–>创建Activity–>开始运行Activity–>正在运行Activity
  • 2)界面从“运行”—>“死亡”
    点击返回键


    暂停(休眠)–>停止–>销毁
  • 3)界面从“运行”—>“停止”
    点击HOME


暂停–>停止


  • 4)界面从“停止”—>“运行”
    长按HOME键


    重新开始–>开始–>正在运行
  • 5)界面从“运行”—>“暂停”
    a. 修改布局activity_main界面
    添加一个按钮

  1. [/code] b.在MainActivity类当中添加方法
  2. [align=center][img]https://img-blog.csdnimg.cn/20201227230318120.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzU3MDM0,size_16,color_FFFFFF,t_70[/img][/align]
  3. [code]public void startSecond(View v){                startActivity(new Intent(this,SecondActivity.class));        }
复制代码
c.创建SecondActivity类

d.修改activity_second.xml

e.修改AndroidManifest.xml

f.运行



暂停


  • 6)界面从“暂停”—>“运行”
    点空缺处


    运行
3、Activity的TaskStack






  • 只有最上面的任务栈的栈顶的Activity才气显示在窗口当中

4、Activity的launchMode


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

创建MainActivity,SecondActivity,
ThreeActivity以及对应的布局文件activity_main.xml,activity_second.xml,activity_three.xml
(1)standard模式


MainActivity

  1. 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

  1.             
复制代码
SecondActivity

  1. 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

  1.             
复制代码
ThreeActivity

  1. 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

  1.    
复制代码
测试









运行效果


(2)singleTop(顶部单例)模式

修改AndroidManifest.xml

  1. 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)编写代码:
  1.                                                                                          
复制代码

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

MainActivity
  1. 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设置长按监听


  1. 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对应的内容

  1. @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:固定前缀                                 // 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);


  1. @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);

  1. //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、发送文本信息(短信)

  1. 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

直接发送会报错,权限不敷,添加发短信的权限

  1.    
复制代码
5556发送短信

5554吸收到短信

三、知识点总结

1、Activity的明白

a、运动:四大应用组件之一

b、作用:提供能让用户使用并与之交互的界面

c、组件:组件的特点

  1.         它的类必须实现特定接口或继承特定类        需要在设置文件中设置其全类名        它的对象不是通过new来创建的,而是系统自动创建的(反射)        它的对象具有一定的生命周期,它的类中有对应的生命周期回调方法
复制代码
d、在应用开发的时候应用到反射的技能:

  1.         创建基类其他类继承,并会自动调用子类对应的方法        一旦有设置文件就应用到了反射        布局文件界说标签,通过标签对应的名称创建对象        显示意图:Intent(Context context,Class c)
复制代码
2、Intent明白

a、意图:信使(Activity,Service,BroadcastReceiver三个组件间的通信)

b、分类:

  1.         显示:使用当前应用自己的组件        隐式:使用其他应用的组件
复制代码
3、Intent的实验

a、创建:

  1.         显示意图:Intent(Content content,Class activityClass)        隐式:Intent(String action)//与Activity与的action匹配
复制代码
b、携带数据:

  1.         额外数据:putExtra(String key,Xxx value)内部用Map容器生存        特定前缀的数据:setData(Uri data)//data=tel:21212,smsto:21212c、读取获取数据        额外:Xxx getXxxExtra(String key)        有特定前缀:Uri getData()
复制代码
4、Activity的使用

a、界说:

  1.         界说一个类extends Activity并重写生命周期方法        在功能清单文件当中使用注册
复制代码
b、启动

  1.         启动范例一:一般启动:startActivity(Intent intent)        启动范例二:带回调的启动startActivityForResult(Intent intent,int requestCode)        重写:onActivityResult(int requestCode,int resultCode,Intent data)
复制代码
c、竣事

  1.         一般竣事:finish        带效果的竣事:setResult(int resultCode,Intent data)
复制代码
5、Activity的生命周期

a、Activity界面的状态

  1.         运行状态:可见也可使用        暂停状态:可见但不可使用        停止状态:不可见,但对象存在        死亡状态:对象不存在
复制代码
b、Activity的生命周期流程:


三个重要的方法
  1.         onCreate():加载布局,初始化工作        onResume():只有履历此方法,才进入运行状态        onDestory();在对象死亡之前调用,做一些收尾大概清理的工作
复制代码
6、TaskStack和lauchMode

  1.         任务栈和加载模式
复制代码
a、TaskStack(后进先出)

  1.         在Android中,系统用Task Stack(Back Stack)布局来存储管理启动的Activity对象        一个应用启动,系统就会为其创建一个对应的Task Stack来存储并管理该应用的Activity对象只有最上面的任务栈的栈                                 顶的Activity才气显示在窗口中
复制代码
b、lunchMode:

  1.         standard:                标准模式,每次调用startActivity(方法就会产生一个新的实例。        singleTop:                如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例;如果不位于栈顶,会产生一个新的实例。                singleTask:                只有一个实例,默认在当前Task中        singleInstance:                只有一个实例,创建时会新建一个栈,且此栈中不能有别的对象
复制代码
7、实现一个简单功能应用的步调:

  1.         a:外观:分析界面组成,界说布局文件        b:行为:编写Activity的实现                        在onCreate()中加载布局文件:setContextView(layoutId)                        调用findViewById得到需要使用的所有视图对象生存成为成员变量                        给视图对象设置监听器(点击/长按),在回调方法实现响应逻辑        2)使用隐式意图启动系统应用的界面                        如何找到对应的Activity字符串:添加ActivityManager的Log日志,使用系统应用原码找到对应的Activity设置        3)权限:当调用一些系统比力重要的功能时候需要声明
复制代码
来源:https://blog.csdn.net/qq_44757034/article/details/111649778
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )