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开发的环境,防止我自己万一哪天电脑重装系统了,可以直接看这篇博客 ...
随机推荐
- 洛谷1439 排列LCS问题
洛谷1439 排列LCS问题 本题地址:http://www.luogu.org/problem/show?pid=1439 题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输 ...
- Java-String之寻根问底
Java-String之寻根问底 引言 在java编程中,几乎每天都会跟String打交道,因此,深入理解String及其用法十分有必要.下面分三方面来详细说明下String相关的特点及用法 •Imm ...
- 【转】linux下安装opencv
Installation in Linux These steps have been tested for Ubuntu 10.04 but should work with other distr ...
- Eclipse的安装以及与Tomcat的集成
1.下载indgo版本的Eclipse:http://www.eclipse.org(64位:eclipse-jee-indigo-SR2-win32-x86_64.zip) 2.解压到D:\Prog ...
- iOS开发笔记之TableView优化
TableView相信只要是做iOS开发的就不会陌生,目前大多数iOS的app都是采用TabBar+NavigationBar+TableViewController这一主流框架, 既然用的这么频繁, ...
- 推荐一个markdown编辑器-Haroopad
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:推荐一个markdown编辑器-Haroopad.
- C++的静态分发(CRTP)和动态分发(虚函数多态)的比较
虚函数是C++实现多态的工具,在运行时根据虚表决定调用合适的函数.这被称作动态分发.虚函数很好的实现了多态的要求,但是在运行时引入了一些开销,包括: 对每一个虚函数的调用都需要额外的指针寻址 虚函数通 ...
- PowerShell自定义对象
前面的性能高 使用[pscustomobject][ordered]强制类型转换 [pscustomobject][ordered]@{Name= 'Boe'Number = 1ID = 007} 使 ...
- 支持“***Context”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。
在用VS进行MVC开发的过程中遇到如下问题: 支持“***Context”上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库(http://go.microsoft ...
- LINUX系统全部参数 sysctl -a + 网络参数设置
http://blog.lifeibo.com/?p=380 1.sysctl sysctl命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中 [root@ser ...