android入门到熟练(二)----活动
1.活动创建对于每一个后端java类(继承至Activity或者ActionBarActivity)代码都有一个方法需要被重写【onCreate】,
在此方法中可以加载界面资源文件或者绑定元素事件。
protected void onCreate(final Bundle savedInstanceState)//一般savedInstanceState为null,除非在返回界面时已经加载了值。
此处展示savedInstanceState不为空的时候获取其中保存的临时数据填充界面
if(savedInstanceState!=null){
String tempDate=savedInstanceState.getString("keyOne");
Toast.makeText(hellotest2.this,tempDate,Toast.LENGTH_SHORT).show();//界面上弹出提示内容
}
以下savedInstanceState中保存的数据其实是在该界面离开的时候触发的一个事件方法
@Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
String tempData="我们需要保存的数据";
outState.putString("keyOne",tempData);
}
加载layout文件方法:setContentView(R.layout.testhello);
绑定按钮方法:
Button buttonclose=(Button)findViewById(R.id.buttonClose);
buttonclose.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Toast.makeText(hellotest2.this, "你点击了关闭程序按钮", Toast.LENGTH_SHORT).show();
finish();//活动的销毁
}
});
2.在androidManifest.xml中配置活动
<activity
android:name=".hellotest2"//此处指定具体活动类,由于在该文档已经制定了包的全名,所以只写上类名即可
android:theme="@android:style/Theme.Dialog"//只是当前的活动是主题类型的
android:launchMode="singleInstance"//指定该活动堆栈类型
android:label="@string/app_name" >//显示标题名称
<intent-filter>//以下2行代码指明该活动是主活动
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="shishi"/>//辅助信息
<data android:scheme="http"/>//表示该活动可以响应那种类型发服务,此处表示和浏览器一样可以打开网站
</intent-filter>
</activity>
ps:如果在androidManifest没有指定主活动,那么该程序可以被安装,只是看不到活动界面,此种程序作为第三方服务在内部提供给其他应用程序调用,如支付宝快捷支付。
3.创建菜单和响应菜单事件
首先在menu文件夹下面创建菜单资源,如下
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
<item android:id="@+id/action_settings" android:title="@string/action_settings" android:orderInCategory="100" app:showAsAction="never" />
<item android:id="@+id/action_remove" android:title="@string/remove" android:orderInCategory="100" app:showAsAction="never" />
</menu>
在菜单中添加了2个菜单选项,分别都定义了各自的ID
然后在活动java代码中编写如下方法:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);//加载具体的菜单文件,第二个参数表示要把资源添加到的菜单项
return true;
}
响应菜单按钮
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();//获取id值
switch (id)
{
case R.id.action_settings:
Toast.makeText(this,"你点击了设置菜单",Toast.LENGTH_SHORT).show();
break;
case R.id.action_remove:
Toast.makeText(this,"你点击了删除菜单",Toast.LENGTH_SHORT).show();
break;
default:
}
return super.onOptionsItemSelected(item);
}
4.Intent在活动间的使用
Intent是Android程序中组件之间进行交互的一种方式,可以指明当前组件要想执行的动作,还可以传递数据。它一般可用于启动活动,启动服务,发送广播等场景。Intent可以分为显示Intent和隐式Intent。代码如下:
【显示Intent】
String data="这个是我从上一个界面传过来的值哦!";
Intent intent=new Intent(hellotest2.this,SecondActivity.class);//显示Intent
intent.putExtra("data",data);//传递数据
savedInstanceState.putString("keyOne","数据1");
savedInstanceState.putDouble("keyTwo",3.44);
intent.putExtra("dataBundle",savedInstanceState);//传递Bundle
//startActivity(intent);//第一种启动方式,关闭活动后不会回调
startActivityForResult(intent,1);//第二种启动方式,关闭启动的活动后会调用现在活动的回调函数
//通过startActivityForResult启动活动后再关闭活动后回调函数,处理上一个活动的数据
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data)
{
switch (requestCode){
case 1:
if(resultCode==RESULT_OK){
String shuju= data.getStringExtra("dataint");
Toast.makeText(hellotest2.this,shuju,Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
【隐式Intent】
表示不明确指定具体的上下文和启动的类,而是通过action和category等信息,交给系统去分析Intent,并且去找合适的活动在启动。
<activity
android:launchMode="singleInstance"
android:name=".SecondActivity">
<intent-filter>
<action android:name="lalaalal"/>//隐式Intent的action和这个匹配
<category android:name="android.intent.category.DEFAULT"/>//表示可以不指定任何category
<category android:name="shishi"/>//隐式Intent的category 和这个匹配
</intent-filter>
</activity>
只有Intent的action和category与配置文件都对应才能启动该活动,其中action只能指定一个而category可以指定多个如下:
Intent intent=new Intent("lalaalal");
intent.addCategory("shishi");
startActivity(intent);
5.Intent的其他隐式使用方法
启动浏览器:
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
上面采用的直接调用android自带的浏览器,我们可以设置某个活动响应以上的Intent,而且还可以扩展,如下:
<activity android:name=".ThridActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http"/>//指定响应端口
<data android:mimeType=""/>//指定响应具体的文件类型
</intent-filter>
</activity>
只有Intent中携带的Data和android中<data>指定的data完全一致的情况活动才会响应对应Intent.
【拨打电话】
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
6.Intent传递数据
准备要传的数据
String data="这个是我从上一个界面传过来的值哦!";
Intent intent=new Intent(hellotest2.this,SecondActivity.class);
intent.putExtra("data",data);//传入数据
savedInstanceState.putString("keyOne","数据1");
savedInstanceState.putDouble("keyTwo",3.44);
intent.putExtra("dataBundle",savedInstanceState);//传入Bundle
//startActivity(intent);
startActivityForResult(intent,1);
在另外一个活动中接收数据
@Override
protected void onCreate(Bundle savedIndtanceState) {
super.onCreate(savedIndtanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();//获取Intent,该Intent是在上一个活动中创建的
String data = intent.getStringExtra("data");//获取Intent中的数据
Bundle bundle=intent.getBundleExtra("dataBundle");//获取Intent中的Bundle
String bundleString=bundle.getString("keyOne");//获取Bundle中的值
Double bundleDouble=bundle.getDouble("keyTwo");
Log.i("我是提示数据",bundleString);//显示日志
Log.i("我是提示数据",bundleDouble.toString());
Button btnScdOne=(Button)findViewById(R.id.btnScdOne);
btnScdOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();//新建一个Intent,用于传递回之前的活动,在之前活动的回调中会使用
intent.putExtra("dataint", "999");
setResult(RESULT_OK, intent);//向上一个活动传递数据方法,在上一个活动中有一个回调函数onActivityResult
finish();
}
});
}
ps:在一个界面想获取以前的数据需要调用onSaveInstanceState,在界面加载的时候判断onCreate中的Bundle是否为空在取出数据,另一个是在当前活动启动一个新活动,在该活动结束时需要传递一些数据到本活动,我们需要在当前活动用startActivityForResult方法启动它,然后再本活动中定义一个回调函数onActivityResult,在此函数中获取销毁活动的数据。同时还要注意用户通过back键返回,那就要重写onBackPressed
@Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
String tempData="我们需要保存d数据";
outState.putString("keyOne",tempData);
}
@Override
public void onBackPressed(){
Intent intent=new Intent();
intent.putExtra("dataint", "999");
setResult(RESULT_OK, intent);//向上一个活动传递数据方法
finish();
}
除了Intent能保存数据Bundle 也能保存数据
7.活动周期
活动状态:运行状态,暂停状态,停止状态,销毁状态
活动生存周期:onCreate(),onstart(),onResume(),onPause(),onStop(),onDestroy(),onRestart()
8.活动的启动模式
standard,singleTop,singleTask,singleInstance,他们都是在androidManifest.xml中通过
<activity android:launchMode="singleInstance" android:name=".SecondActivity">设定的,
standard:每次启动都会重新建立一个活动放到堆栈中去
singleTop:如果在栈顶都是当前要创建的活动那么就不再创建活动
singleTask:如果发现在栈中已经有要创建的活动,那么把栈上面的活动依次出栈到需要的活动位置
singleInstance:为创建的活动单独创建一个栈,不受其他活动的影响,对于singleTask如果指定了不同的taskAffinity也会起到一个新的返回栈。该模式在其他程序需要对本程序的某个活动调用的场景使用。可以通过getTaskId()获取栈的标识号。
9.活动的最佳实践
知道当前在哪一个活动:添加一个类继承至Activity,然后其他说有的类都集成至该类,在onstart中Log显示出类名,getClass().getSimpleName()
一次性推出程序:方法是建立一个类,在类中定义一个Activity的List静态数组,并且实现3个方法,添加,删除,和循环读取活动在finish(),在基类活动或者每个活动启动时调用添加,销毁时调用删除,在某个事件触发退出程序是调用循环销毁。
启动的最佳写法:不管用startActivity或startActivityForResult启动一个活动,可能启动该活动需要依稀额外的数据,我们需要查看代码,最好的办法就是在需要启动的活动中添加一个静态方法,该方法有需要的启动上下文,以及各种数据:如下
在需要启动的活动类或者基类中添加如下代码
public static void actionStart(Context context,String data1,String data2)
{
Intent intent=new Intent(context,SecondActivity.class);//当前要启动的活动
intent.putExtra("paream1",data1);
intent.putExtra("paream2",data2);
context.startActivity(intent);
}
在要启动该活动的地方只需要调用该方法即可,不必麻烦再翻阅代码查看需要什么参数。
android入门到熟练(二)----活动的更多相关文章
- Android入门教程(二)
Hello World 项目 首先当我们启动Android Studio的虚拟机时,可以看到第一个项目Hello World,那么虚拟机中的Hello World!是如何书写的呢? 看看虚拟机运行结果 ...
- android入门到熟练(一)
1.andro系统架构:Linux内核层(提供驱动),系统运行库层和android运行时库(提供C/C++库的主要特性,如SQLite,OpenGL,Webkit等和Dalvik虚拟机),应用框架层, ...
- android入门到熟练(五)---广播
1.广播类型:标准广播和有序广播.标准广播是异步广播在广播发出之后所有接收器几乎会同一时刻接收到,没有先后顺序,效率高,但无法被截断.有序广播则是同步广播,同一时刻只能一个接收器接收这条消息,等执行完 ...
- android入门到熟练(三)----UI界面
1.TextView 以下只是一部分属性,还有很多属性需要在用到时候再说 <TextView android:textSize="24sp"//文字大小 android:te ...
- Android入门(十二)SQLite事务、升级数据库
原文链接:http://www.orlion.ga/610/ 一.事务 SQLite支持事务,看一下Android如何使用事务:比如 Book表中的数据都已经很老了,现在准备全部废弃掉替换成新数据,可 ...
- Android入门教程之我见
真正的从安卓入门学习到实际工作也差不多一年时间了,也做了几个项目.在这期间经历了一开始学习Android的基本知识后仍旧无从下手,不知道如何开始开发一个app,到现在也开始学会注意Android架构的 ...
- 【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity
问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...
- Android入门(一)
原文链接:http://www.orlion.ga/387/ 一.安卓的系统架构 1. linux内核层,这一层为安卓设备提供底层的驱动 系统运行库层,这一层通过一些C/C++库来为Android系统 ...
- 【转】Xamarin.Android 入门之:Xamarin+vs2015 环境搭建
Xamarin.Android 入门之:Xamarin+vs2015 环境搭建 一.前言 此篇博客主要写了如何使用搭建xamarin开发的环境,防止我自己万一哪天电脑重装系统了,可以直接看这篇博客 ...
随机推荐
- MTK Android Driver知识大全
一.Display 1.lcm 相关概念1.1) MIPI接口:一共有三种接口:DBI(也做CPU或MCU接口).DPI(也叫RGB接口).DSI.在使用DSI接口时,目前75/77都只支持到2条da ...
- 批处理find&findstr命令--众里寻他一次度
find 使用 Command: find [/v][/c][/n][/i] "string" [[drive:][path]filename] Parameter: /v 显示所 ...
- 最短路SPFA
用邻接矩阵a表示一幅图,a[i][j]表示从点i到点j的边长,如果为0则无边.(这是无负边,0边的情况) 这张图有T个点,C条边,要求求出从Ts走到Te的最短路. 用f[i]表示从Ts走到i点的最短路 ...
- 宁波Uber优步司机奖励政策(2月1日~2月7日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 关于一次Weblogic活动线程的问题处理
Weblogic控制台监控发现 环境>>服务器>>你的服务器>>监控>>线程 中活动执行线程竟然是2000多.同一套系统在另一套平台上,并且访问的人不少 ...
- IOS开发之UINavigationController详解
UINavigationController是IOS编程中比较常用的一种容器view controller,很多系统的控件(如UIImagePickerViewController)以及很多有名的AP ...
- Spring源代码解析(收藏)
Spring源代码解析(收藏) Spring源代码解析(一):IOC容器:http://www.iteye.com/topic/86339 Spring源代码解析(二):IoC容器在Web容器中的 ...
- ibatis 开发中的经验 (一)ibatis 和hibernate 在开发中的理解
这个项目的底层是用ibatis框架完毕,这几天也是都在用这个框架写代码,也有了一些简单的理解,把项目拿过来后基本的配置都已经配置好了,比方一些事务.日志控制等,在开发中主要用到的是写SQL语句以及熟悉 ...
- js中跨域请求原理及2种常见解决方案
一.同源策略: 说到跨域请求,首先得说说同源策略: 1995年,同源政策是由 Netscape 公司引入浏览器的.目前,所有浏览器都实行了这个政策. 同源策略是浏览器的一种安全策略,所谓同源是指,域名 ...
- android 6.0获取 WRITE_SETTINGS 权限
android 6.0上只写在AndroidManifest中是不行的,还必须手动打开才行 private void setBrightnessMode(Context context, int mo ...