Android基础入门教程——4.1.1 Activity初学乍练

Android基础入门教程——4.1.1 Activity初学乍练

标签(空格分隔): Android基础入门教程


本节引言:

本节开始讲解Android的四大组件之一的Activity(活动),先来看下官方对于Activity的介绍:
PS:官网文档:Activity

介绍如下:

大概意思:

Activity是一个应用程序的组件,他在屏幕上提供了一个区域,允许用户在上面做一些交互性的操作,
比如打电话,照相,发送邮件,或者显示一个地图!Activity可以理解成一个绘制用户界面的窗口,
而这个窗口可以填满整个屏幕,也可能比屏幕小或者浮动在其他窗口的上方!

从上面这段话,我们可以得到以下信息:

1. Activity用于显示用户界面,用户通过Activity交互完成相关操作
2. 一个App允许有多个Activity

好了,大概的引言就介绍到这里,想深入了解可以继续看API,开始本节内容~


1.Activity的概念与Activity的生命周期图:

注意事项:

1. onPause()和onStop()被调用的前提是
打开了一个新的Activity!而前者是旧Activity还可见的状态;后者是旧Activity已经不可见!
2. 另外,亲测:AlertDialog和PopWindow是不会触发上述两个回调方法的~


2.Activity/ActionBarActivity/AppCompatActivity的区别:

在开始讲解创建Activity之前要说下这三个的一个区别:
Activity就不用说啦,后面这两个都是为了低版本兼容而提出的提出来的,他们都在v7包下,
ActionBarActivity已被废弃,从名字就知道,ActionBar~,而在5.0后,被Google弃用了,现在用
ToolBar…而我们现在在Android Studio创建一个Activity默认继承的会是:AppCompatActivity!
当然你也可以只写Activity,不过AppCompatActivity给我们提供了一些新的东西而已!
两个选一个,Just you like~


3.Activity的创建流程

PS:

好了,上面也说过,可以继承Activity和AppCompatActivity,只不过后者提供了一些新的东西而已!
另外,切记,Android中的四大组件,只要你定义了,无论你用没用,都要在AndroidManifest.xml对
这个组件进行声明,不然运行时程序会直接退出,报ClassNotFindException…


4.onCreate()一个参数和两个参数的区别:

相信用as的朋友在重写Act的onCreate()方法时会发现,这玩意有两个参数:

可是正常的才只有一个参数啊:

恩呢,这就是5.0给我们提供的新的方法,要用它,先要在配置文件中为我们的Activity设置一个属性:

android:persistableMode="persistAcrossReboots"

然后我们的Activity就拥有了持久化的能力了,一般我们会搭配另外两个方法来使用:

public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState)

相信有些朋友对这两个方法名不陌生吧,前一个方法会在下述情形中被调用:

  1. 点击home键回到主页或长按后选择运行其他程序
  2. 按下电源键关闭屏幕
  3. 启动新的Activity
  4. 横竖屏切换时,肯定会执行,因为横竖屏切换的时候会先销毁Act,然后再重新创建
    重要原则:当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,
    这是系统的责任,因为它必须要提供一个机会让你保存你的数据(你可以保存也可以不保存)。

而后一个方法,和onCreate同样可以从取出前者保存的数据:
一般是在onStart()和onResume()之间执行!
之所以有两个可以获取到保存数据的方法,是为了避免Act跳转而没有关闭,
然后不走onCreate()方法,而你又想取出保存数据~

说回来:
说回这个Activity拥有了持久化的能力,增加的这个PersistableBundle参数令这些方法
拥有了系统关机后重启的数据恢复能力!!而且不影响我们其他的序列化操作,卧槽,
具体怎么实现的,暂时还不了解,可能是另外弄了个文件保存吧~!后面知道原理的话会告知下大家!
另外,API版本需要>=21,就是要5.0以上的版本才有效~


4.启动一个Activity的几种方式

在Android中我们可以通过下面两种方式来启动一个新的Activity,注意这里是怎么启动,而非
启动模式!!分为显示启动和隐式启动!

1. 显式启动:通过包名来启动,写法如下:

①最常见的:
startActivity(new Intent(当前Act.this,要启动的Act.class));
②通过Intent的ComponentName:
ComponentName cn = new ComponentName(“当前Act的全限定类名”,”启动Act的全限定类名”) ;
Intent intent = new Intent() ;
intent.setComponent(cn) ;
startActivity(intent) ;
初始化Intent时指定包名:
Intent intent = new Intent(“android.intent.action.MAIN”);
intent.setClassName(“当前Act的全限定类名”,”启动Act的全限定类名”);
startActivity(intent);

**2.隐式启动:通过Intent-filter的Action,Category或data来实现
这个是通过Intent的 * intent-filter*来实现的,这个Intent那章会详细讲解!
这里知道个大概就可以了!

3. 另外还有一个直接通过包名启动apk的:

**Intent intent = getPackageManager().getLaunchIntentForPackage
(“apk第一个启动的Activity的全限定类名”) ;
if(intent != null) startActivity(intent) ;**


5.横竖屏切换与状态保存的问题

前面也也说到了App横竖屏切换的时候会销毁当前的Activity然后重新创建一个,你可以自行在生命周期
的每个方法里都添加打印Log的语句,来进行判断,又或者设一个按钮一个TextView点击按钮后,修改TextView
文本,然后横竖屏切换,会神奇的发现TextView文本变回之前的内容了!
横竖屏切换时Act走下述生命周期:
onPause-> onStop-> onDestory-> onCreate->onStart->onResume
关于横竖屏切换可能遇到下述问题:


1.先说下如何禁止屏幕横竖屏自动切换吧,很简单,在AndroidManifest.xml中为Act添加一个属性:
android:screenOrientation
有下述可选值:
unspecified:默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
landscape:横屏显示(宽比高要长)
portrait:竖屏显示(高比宽要长)
user:用户当前首选的方向
behind:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
sensor:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
nosensor:忽略物理感应器,这样就不会随着用户旋转设备而更改了(”unspecified”设置除外)。


2.横竖屏时想加载不同的布局
1)准备两套不同的布局,Android会自己根据横竖屏加载不同布局:
创建两个布局文件夹:
layout-land横屏,layout-port竖屏
然后把这两套布局文件丢这两文件夹里,文件名一样,Android就会自行判断,然后加载相应布局了!

2 )自己在代码中进行判断,自己想加载什么就加载什么:
我们一般是在onCreate()方法中加载布局文件的,我们可以在这里对横竖屏的状态做下判断,关键代码如下:

if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){  
     setContentView(R.layout.横屏);
}  

else if (this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) {  
    setContentView(R.layout.竖屏);
}

3. 如何让模拟器横竖屏切换
如果你的模拟器是GM的话。直接按模拟器上的切换按钮即可,原生模拟器可按ctrl + f11/f12切换!


4. 状态保存问题:
这个上面也说过了,通过一个Bundle savedInstanceState参数即可完成!
三个核心方法:


onCreate(Bundle savedInstanceState);
onSaveInstanceState(Bundle outState);
onRestoreInstanceState(Bundle savedInstanceState);

你只重写onSaveInstanceState()方法,往这个bundle中写入数据,比如:

outState.putInt(“num”,1);

这样,然后你在onCreate或者onRestoreInstanceState中就可以拿出里面存储的数据,不过拿之前要判断下是否为null哦!

savedInstanceState.getInt(“num”);

然后想干嘛就干嘛~


6.系统给我们提供的常见的Activity

好的,最后给大家附上一些系统给我们提供的一些常见的Activtiy吧!

//1.拨打电话
// 给移动客服10086拨打电话
Uri uri = Uri.parse("tel:10086");
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);


//2.发送短信
// 给10086发送内容为“Hello”的短信
Uri uri = Uri.parse("smsto:10086");
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
intent.putExtra("sms_body", "Hello");
startActivity(intent);



//3.发送彩信(相当于发送带附件的短信)
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra("sms_body", "Hello");
Uri uri = Uri.parse("content://media/external/images/media/23");
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType("image/png");
startActivity(intent);


//4.打开浏览器:
// 打开Google主页
Uri uri = Uri.parse("http://www.baidu.com");
Intent intent  = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);



//5.发送电子邮件:(阉割了Google服务的没戏!!!!)
// 给someone@domain.com发邮件
Uri uri = Uri.parse("mailto:someone@domain.com");
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(intent);
// 给someone@domain.com发邮件发送内容为“Hello”的邮件
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, "someone@domain.com");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Hello");
intent.setType("text/plain");
startActivity(intent);
// 给多人发邮件
Intent intent=new Intent(Intent.ACTION_SEND);
String[] tos = {"1@abc.com", "2@abc.com"}; // 收件人
String[] ccs = {"3@abc.com", "4@abc.com"}; // 抄送
String[] bccs = {"5@abc.com", "6@abc.com"}; // 密送
intent.putExtra(Intent.EXTRA_EMAIL, tos);
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_BCC, bccs);
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Hello");
intent.setType("message/rfc822");
startActivity(intent);



//6.显示地图:
// 打开Google地图中国北京位置(北纬39.9,东经116.3)
Uri uri = Uri.parse("geo:39.9,116.3");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);


//7.路径规划
// 路径规划:从北京某地(北纬39.9,东经116.3)到上海某地(北纬31.2,东经121.4)
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=39.9 116.3&daddr=31.2 121.4");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);




//8.多媒体播放:
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file:///sdcard/foo.mp3");
intent.setDataAndType(uri, "audio/mp3");
startActivity(intent);

//获取SD卡下所有音频文件,然后播放第一首=-= 
Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);



//9.打开摄像头拍照:
// 打开拍照程序
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, 0);
// 取出照片数据
Bundle extras = intent.getExtras(); 
Bitmap bitmap = (Bitmap) extras.get("data");

//另一种:
//调用系统相机应用程序,并存储拍下来的照片
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
time = Calendar.getInstance().getTimeInMillis();
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment
.getExternalStorageDirectory().getAbsolutePath()+"/tucue", time + ".jpg")));
startActivityForResult(intent, ACTIVITY_GET_CAMERA_IMAGE);






//10.获取并剪切图片
// 获取并剪切图片
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent.putExtra("crop", "true"); // 开启剪切
intent.putExtra("aspectX", 1); // 剪切的宽高比为1:2
intent.putExtra("aspectY", 2);
intent.putExtra("outputX", 20); // 保存图片的宽和高
intent.putExtra("outputY", 40); 
intent.putExtra("output", Uri.fromFile(new File("/mnt/sdcard/temp"))); // 保存路径
intent.putExtra("outputFormat", "JPEG");// 返回格式
startActivityForResult(intent, 0);
// 剪切特定图片
Intent intent = new Intent("com.android.camera.action.CROP"); 
intent.setClassName("com.android.camera", "com.android.camera.CropImage"); 
intent.setData(Uri.fromFile(new File("/mnt/sdcard/temp"))); 
intent.putExtra("outputX", 1); // 剪切的宽高比为1:2
intent.putExtra("outputY", 2);
intent.putExtra("aspectX", 20); // 保存图片的宽和高
intent.putExtra("aspectY", 40);
intent.putExtra("scale", true);
intent.putExtra("noFaceDetection", true); 
intent.putExtra("output", Uri.parse("file:///mnt/sdcard/temp")); 
startActivityForResult(intent, 0);


//11.打开Google Market 
// 打开Google Market直接进入该程序的详细页面
Uri uri = Uri.parse("market://details?id=" + "com.demo.app");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);


//12.进入手机设置界面:
// 进入无线网络设置界面(其它可以举一反三)  
Intent intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS)
startActivityForResult(intent, 0);



//13.安装apk:
Uri installUri = Uri.fromParts("package", "xxx", null);   
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);

//14.卸载apk:
Uri uri = Uri.fromParts("package", strPackageName, null);      
Intent it = new Intent(Intent.ACTION_DELETE, uri);      
startActivity(it); 

//15.发送附件:
Intent it = new Intent(Intent.ACTION_SEND);      
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");      
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/eoe.mp3");      
sendIntent.setType("audio/mp3");      
startActivity(Intent.createChooser(it, "Choose Email Client"));

//16.进入联系人页面:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(People.CONTENT_URI);
startActivity(intent);


//17.查看指定联系人:
Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, info.id);//info.id联系人ID
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(personUri);
startActivity(intent);

本节小结:

好吧,写着写着就不像入门教程了,哈哈,不过学多点没事的,本节初窥门径就到这里吧~下节我们会继续来研究这个Activity,比如数据传递,启动模式等~敬请期待~

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
内容简介   《Android基础教程(第3版·修订版)》是一部关于Android开发的基础教程,采用Pragmatic系列图书一贯由浅入深、循序渐进的方式讲解了Android程序设计的核心概念和技术。书中不仅结合数独游戏开发案例形象生动地讲解了Android生命周期、用户界面、2D图形、多媒体,以及本地数据存储等基础知识,而且通过“Hello, Android”项目深入探讨了外部通信、基于位置的服务、内置SQLite数据库、3D图形、多点触控、小部件、兼容性测试,以及如何向AndroidMarket发布应用程序等内容。前13章章尾均有“快速阅读指南”,你无需按照顺序阅读该章,即可迅速找到所需信息,并高效地完成工作。   《Android基础教程(第3版·修订版)》适合所有移动开发人员学习参考。 目录 第一部分 Android简介 第1章 快速入门 1.1 安装工具 1.1.1 Java 5.0+ 1.1.2 Eclipse 3 1.1.3 AndroidSDK启动程序软件包 1.1.4 AndroidSDK组件 1.1.5 Eclipse插件 1.2 创建第一个程序 1.3 在模拟器上运行程序 1.3.1 创建一个AVD 1.3.2 再试一次 1.4 在手机上运行程序 1.5 快速阅读指南 第2章 基本概念 2.1 Android的系统架构 2.1.1 Linux内核 2.1.2 本机库 2.1.3 Android运行时 2.1.4 应用程序框架 2.1.5 应用程序和小部件 2.2 它还活着 2.2.1 进程不等于应用程序 2.2.2 应用程序生命周期 2.3 构建块 2.3.1 活动 2.3.2 意图 2.3.3 服务 2.3.4 内容提供者 2.4 使用资源 2.5 安全性 2.6 快速阅读指南 第二部分 Android基础知识 第3章 设计用户界面 3.1 数独游戏简介 3.2 声明性设计 3.3 创建启动界面 3.4 使用替代资源 3.5 实现About对话框 3.6 应用主题 3.7 添加菜单 3.8 添加设置 3.9 开始新游戏 3.1 调试程序 3.10.1 利用日志消息调试程序 3.10.2 利用调试器调试程序 3.11 退出游戏 3.12 快速阅读指南 第4章 绘制2D图形 4.1 Android图形基础 4.1.1 Color类 4.1.2 Paint类 4.1.3 Canvas类 4.1.4 Path类 4.1.5 Drawable类 4.2 在数独程序中添加图形 4.2.1 开始游戏 4.2.2 定义Game类 4.2.3 定义PuzzleView类 4.2.4 绘制游戏盘面 4.2.5 绘制数字 4.3 处理输入 4.3.1 定义和更新选定区域 4.3.2 输入数字 4.3.3 增加提示 4.3.4 抖动幕 4.4 其他问题 4.4.1 创建软键盘 4.4.2 实现游戏逻辑 4.4.3 其他功能 4.5 更多改进 4.6 快速阅读指南 第5章 多媒体 5.1 播放音频 5.2 播放视频 5.3 为数独游戏配上音乐 5.4 快速阅读指南 第6章 存储本地数据 6.1 为数独游戏添加选项 6.2 继续玩前一个游戏 6.3 记住当前位置 6.4 访问内部文件系统 6.5 访问SD卡 6.6 快速阅读指南 第三部分 高级主题 第7章 互联的世界 7.1 通过意图实现浏览 7.2 利用视图打开网页 7.3 JavaScript与Java通信 7.4 使用Web服务 7.5 快速阅读指南 第8章 定位与环境感知 8.1 位置,位置,位置 8.1.1 我在哪里 8.1.2 更新位置 8.1.3 模拟说明 8.2 充分利用传感器 8.2.1 了解传感器 8.2.2 解析传感器的读数 8.2.3 模拟说明 8.3 地图功能 8.3.1 嵌入MapView 8.3.2 准备就绪 8.3.3 模拟说明 8.4 快速阅读指南 第9章 SQL实战 9.1 SQLite简介 9.2 SQL基础 9.2.1 DDL语句 9.2.2 修改语句 9.2.3 查询语句 9.3 你好,数据库 9.3.1 使用SQLiteOpenHelper 9.3.2 定义主程序 9.3.3 添加一行 9.3.4 运行一个查询 9.3.5 显示查询结果 9.4 数据绑定 9.5 使用ContentProvider 9.5.1 更改主程序 9.5.2 添加一行 9.5.3 运行一个查询 9.6 实现ContentProvider 9.7 快速阅读指南 第10 章 利用OpenGL实现3D图形 10.1 理解3D图形 10.2 OpenGL简介 10.3 构建一个OpenGL程序 10.4 渲染场景 10.5 构建一个模型 10.6 光线、相机 10.7 动作 10.8 应用纹理 10.9 透明效果 10.1 测量平滑度 10.11 快速阅读指南 第四部分 下一代产品 第11章 多点触控 11.1 多点触控概述 11.2 创建触控示例 11.3 了解触控事件 11.4 设置图像变换 11.5 实现拖动动作 11.6 实现捏压缩放动作 11.6.1 两个点之间的距离 11.6.2 两个点的中点 11.7 快速阅读指南 第12章 主界面 12.1 Hello,Widget 12.1.1 创建第一个小部件程序 12.1.2 调用所有小部件 12.1.3 拉伸以适合幕尺寸 12.1.4 使用和扩展 12.1.5 运行小部件 12.1.6 最新进展 12.1.7 快乐之旅 12.2 动态壁纸 12.2.1 创建壁纸项目 12.2.2 服务简介 12.2.3 创建一个绘图引擎 12.2.4 重用OpenGL代码 12.2.5 创建和销毁引擎 12.2.6 管理Surface 12.2.7 可视化壁纸 12.2.8 响应用户的输入 12.3 快速阅读指南 第13章 一次编写,到处测试 13.1 启动模拟器 13.2 创建适用于多个版本的程序 13.3 AndroidAPI的发展 13.4 大量错误 13.5 各种幕尺寸 13.6 在SD卡上安装程序 13.7 快速阅读指南 第14章 发布到AndroidMarket 14.1 准备工作 14.2 签名 14.3 发布 14.4 更新 14.5 结语 第五部分 附录 附录A Java与Android:语言及其API 附录B 参考书目

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值