@stepbystep
2015-01-18T09:48:35.000000Z
字数 11038
阅读 3969
Android
Activity的4个状态
Activity的生命周期图示的理解
启动Activity有两种方式,直接启动和带返回值的启动
Intent intent=new Intent(this,NewActivity.class);this.startActivity(intent);
使用starActivityForResult(Intent intent, int requestCode)方法来实现
在被启动的Activity中调用如下
Intent data=new Intent();data.putExtra("name",name);this.setResult(RESULTCOCE, data);//销毁当前Actvitythis.finish();
onActivityResult(int requestCode, int resutlCode, Intent data) 方法获取返回值finish() 方法
调用后Activity会依次执行onPause()->onStop()->onDestroy(), 如果此时Activity已经停止,则只调用onDestroy()
如果此Activity是带返回值方式启动的,那么会给启动它的Activity返回一些信息
finishActivity(int requestCode)方法
通过requestCode参数来关闭其他的Activity
他们都必须由调用此方法的Activity所启动,使用starActivityForResult函数
新建一个工程名为IntentActivity, 再新建一个Activity,因为之前已经试过全程手工新建普通java文件再编辑的流程,此后,我们一般采用系统新建Activity的方法,因为会自动在AndroidManifest.xml文件中注册该Activity

新建MainActivity

同理新建OtherActivity和OnResultActivity, 新建后,工程目录如下:

activity_main.xml
<!-- 线性布局android:orientation="vertical" 必须加,因为线性布局默认的是水平的--><LinearLayout 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"android:orientation="vertical"><!-- EditText的属性editTexxt表示可输入的文本框,类似html的input标签android:textColor="#2988e4" 设置文本显示的颜色,此处采用html格式,#后面可以跟3位,6位,8位16进制数android:textSize="18sp" 设置字体大小,注意字体一般使用18spandroid:hint="" 表示该TextView在文本为空的时候显示的内容android:layout_margin="10dp" 表示距离周围的其他控件4个方向都是10dp 注意,表示间隔一般用dp为单位--><EditTextandroid:id="@+id/txt_input"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:textColor="#2988e4"android:textSize="18sp"android:hint="在此处输入需要传递的信息"/><!-- Button的属性android:onClick="clickOtherActivity" 表示点击此按钮调用的事件,在对应的Activity文件中需要添加public void startActivityNoResult(View v)() 的函数--><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:text="点我无返回值的打开"android:onClick="startActivityNoResult"/><Buttonandroid:id="@+id/btn_on_result_activity"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:text="点我带返回值的打开,修改我自己"android:onClick="startActivityWithResult"/></LinearLayout>
MainActivity.java
package com.example.shiyanlou.intentactivity;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.widget.Button;import android.widget.EditText;import android.widget.TextView;// 此处修改为继承自Activitypublic class MainActivity extends Activity {// 对应布局文件中的TextViewEditText txtInput = null;// 对应布局文件中的点击带返回值的ButtonButton btnResult = null;// 请求码:指定启动源(从当前界面的那个控件部分启动的)private static final int REQUEST_CODE = 1;// 用系统生成工具会自动创建如下代码@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//寻找控件txtInput = (EditText)this.findViewById(R.id.txt_input);btnResult = (Button)this.findViewById(R.id.btn_on_result_activity);}/*** 启动Activity不带返回值* Intent(意图):想要干什么.* Intent意图的分类:* 1.显式意图:指定启动目标(组件名)的意图;* 2.隐式意图:没有指定组件名,是通过匹配Action,Category和Data进行目标组件的查找的.* Intent的功能:1.激活组件;2.携带数据** 对应Button中的onClick属性,注意,此处应该带参数View*/public void startActivityNoResult(View view){// 首先判断txtInput内容是否为空if(txtInput.getText().toString().isEmpty()){// 设置txtInput显示错误信息txtInput.setError("输入内容不能为空!");return;}//使用显式意图激活组件方式如下//方式1Intent intent=new Intent(this, OtherActivity.class);//方式2//Intent intent=new Intent();//intent.setClass(this,OtherActivity.class);//方式3//Intent intent=new Intent();//intent.setClassName(this,"com.example.shiyanlou.intentactivity.OtherActivity");//方式4//Intent intent=new Intent();//ComponentName component=new ComponentName(this, OtherActivity.class);//intent.setComponent(component);//携带数据的方式如下//方式1//intent.putExtra("name","张三");//intent.putExtra("text", txtInput.getText().toString());//方式2Bundle bundle=new Bundle();bundle.putString("text", txtInput.getText().toString());intent.putExtras(bundle);// 直接启动ActivitystartActivity(intent);}/*** 启动Activity带返回值* 对应Button中的onClick属性,注意,此处应该带参数View*/public void startActivityWithResult(View view){Intent intent=new Intent(this,OnResultActivity.class);/** 启动目标Activity并要求带回目标Activity中的数据到当前Activity,方式是* 重写源Activity中的onActivityResult方法*/startActivityForResult(intent, REQUEST_CODE);}@Override/*** 重写onActivityResult方法* @param requestCode 指定启动源* @param resultCode 指定目标或者目标的哪个部分被点击后返回的值* @param data 在目标Activity被销毁前使用this.setResult(REQUEST_CODE, intent);* 方法后携带数据的intent值, 即data==intent*/protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);//指定哪个启动源启动的目标Activityif(requestCode==REQUEST_CODE){//指定目标Activity的那个控件被点击后返回的值if(resultCode == OnResultActivity.RESULT_CODE){String txt=data.getStringExtra("text");btnResult.setText("我被修改为"+txt);}}}}
activity_on_result.xml
<LinearLayout 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"android:orientation="vertical"><!-- 此处同样也用EditTextandroid:gravity="start" 表示从控件的开始部分显示android:padding="20dp" 设置内间距为20dp,4个方向都有--><EditTextandroid:id="@+id/txt_result"android:layout_width="match_parent"android:layout_height="200dp"android:textSize="30sp"android:hint="我将传递数据给MainActivity"android:textColor="#2988e4"android:padding="20dp"android:gravity="start"/><Buttonandroid:id="@+id/btn_commit"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:textSize="20dp"android:text="提交数据"/></LinearLayout>
OnResultActivity.java
package com.example.shiyanlou.intentactivity;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.EditText;// 实现点击事件的新方法, 主类实现OnclickListener接口,并重写onClick方法public class OnResultActivity extends Activity implements View.OnClickListener{private EditText txtResult;public static final int RESULT_CODE = 2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_on_result);txtResult = (EditText) this.findViewById(R.id.txt_result);// 注册点击事件,因为本类实现了OnClickListener接口,故而此处填写thisthis.findViewById(R.id.btn_commit).setOnClickListener(this);}@Overridepublic void onClick(View v) {if(v.getId() == R.id.btn_commit){// 点击提交String text=this.txtResult.getText().toString();if(TextUtils.isEmpty(text)){// 为空的时候让EditText显示错误信息txtResult.setError("请填写返回信息");return;}Intent data=new Intent();data.putExtra("text",text);//指定当前Activity被销毁时 向启动源返回的结果码和意图对象(携带数据)this.setResult(RESULT_CODE, data);//销毁当前Actvitythis.finish();}}}
activity_other.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"><TextViewandroid:id="@+id/txt_get_content"android:text="I am OtherActivity"android:layout_width="match_parent"android:layout_height="match_parent"android:textSize="30sp"android:textColor="#2988e4"android:gravity="center"/></RelativeLayout>
OtherActivity.java
package com.example.shiyanlou.intentactivity;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.TextView;public class OtherActivity extends Activity {public TextView txtGetContent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_ohter);txtGetContent = (TextView) this.findViewById(R.id.txt_get_content);// 获取从MainActivity传递过来的数据,注意两边传递的键必须相同,否则此处获取到的将是空// 得到意图中的数据方式1String text = getIntent().getStringExtra("text");//得到意图中的数据方式2/*Bundle bundle=getIntent().getExtras();String text=bundle.getString("text");*/// 设置TextView的值txtGetContent.setText(text);}}
说明,使用上述的新建Activity的方法后,Activity会自动在manifest中注册
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.shiyanlou.intentactivity" ><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="com.example.shiyanlou.intentactivity.MainActivity"android:label="@string/title_activity_main" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:name="com.example.shiyanlou.intentactivity.OnResultActivity"android:label="@string/title_activity_on_result" ></activity><activityandroid:name=".OtherActivity"android:label="@string/title_activity_ohter" ></activity></application></manifest>
进入主界面如下:
此时点击无返回值的打开会报错

输入信息后再点击打开

进入OtherActivity界面,把I am Good Man!传递过去了

按Esc键返回后,点击第二个按钮

进入OnResultActivity, 点击提交按钮,显示错误信息

输入信息后再点击提交

重新进入了到MainActivity,并且修改了第二个Button的显示内容

在<Activity>标签中使用android:label=""属性
在onCreate方法中使用setTitle方法
去除标题栏
//注意这句一定要写在setContentView()方法的前面,不然会报错的//在Activity的onCreate方法中调用requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
<!-- 可以看出,这样写的话,整个应用都会去掉标题栏,如果只想去掉某一个Activity的标题栏的话,可以把这个属性加到activity标签里面--><application android:icon="@drawable/icon"android:label="@string/app_name"android:theme="@android:style/Theme.NoTitleBar">
<?xml version="1.0" encoding="UTF-8" ?><resources><style name="notitle"><item name="android:windowNoTitle">true</item></style></resources>
这样,我们就自定义了一个style,就相当于一个主题,然后在AndroidManifest.xml文件中使用
<application android:icon="@drawable/icon"android:label="@string/app_name"android:theme="@style/notitle">
同上面设置标题一样
- 第一种
// 在onCreate方法中调用getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
第二种
<!-- 直接设置主题为全屏-->android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
第三种
application android:icon="@drawable/icon"android:label="@string/app_name"android:theme="@style/fullscreem"
<Activity>标签中根据情况加入如下字段 android:screenOrientation="portrait" 始终以竖屏显示 android:screenOrientation="landscape" 始终以横屏显示
private OnClickListener onClick=new OnClickListener() {@Overridepublic void onClick(View v) {//设置屏幕为横屏if(v==butLandscrpe){MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//设置为置屏幕为竖屏}else{MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);}}};