Intent,直译为意图,也就是你想要做什么事情,或者想去哪里?
Intent是Activity,Service和BoradcastReceiver这三个应用组件之间进行通信的信者
例如:我要在Activity中启动另外一个Activity,就必须使用Intent对象
意图对象还可以携带数据
注意:Intent不是AndroID中的四大应用组件之一
(2)Intent的分类显示意图:明确指定的目标组件的意图
创建对象:Intent(Context context,Class clazz)
何时使用:当 *** 作当前自己应用的组件时使用
隐式意图:没有明确指定目标组件的意图
创建对象::Intent(String action)
何时使用:当 *** 作其他应用的组件时候使用
IntentFilterIntentFilter的理解IntentFilter意图过滤器
测试
(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(); } }
1)界面从“死亡”—>“运行”:将程序运行即可创建对象–>创建Activity–>开始运行Activity–>正在运行Activity2)界面从“运行”—>“死亡”
点击返回键
暂停(休眠)–>停止–>销毁3)界面从“运行”—>“停止”
点击HOME
暂停–>停止4)界面从“停止”—>“运行”
长按HOME键
从新开始–>开始–>正在运行5)界面从“运行”—>“暂停”
a. 修改布局activity_main界面
添加一个按钮
<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.运行
暂停6)界面从“暂停”—>“运行”
点空白处
运行3、Activity的TaskStack
只有最上面的任务栈的栈顶的Activity才能显示在窗口当中
4、Activity的launchMode5、通过创建一个工程来掌握上诉的方法以及内容
创建MainActivity,SecondActivity,
ThreeActivity以及对应的布局文件activity_main.xml,activity_second.xml,activity_three.xml
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>
SecondActivitypublic 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>
ThreeActivitypublic 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>
测试@H_403_632@
@H_403_656@
运行结果(2)singletop(顶部单例)模式修改AndroIDManifest.xmlandroID:launchMode="singletop"
启动界面后在主界面上点击启动界面1没有反应,在界面2 点击启动界面1的时候,会重新创建一个界面1@L_502_44@(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的onClicka、创建一个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;// 表示此事件已经被消费了,不会再触发点击事件 }
直接运行会抛出异常,权限被拒绝
(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接收到短信
总结
以上是内存溢出为你收集整理的Android快速入门(二)四大应用组件之一Activity(打电话和发短信)功能练习全部内容,希望文章能够帮你解决Android快速入门(二)四大应用组件之一Activity(打电话和发短信)功能练习所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)