@stepbystep
2015-01-18T17:48:35.000000Z
字数 11038
阅读 3849
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);
//销毁当前Actvity
this.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" 设置字体大小,注意字体一般使用18sp
android:hint="" 表示该TextView在文本为空的时候显示的内容
android:layout_margin="10dp" 表示距离周围的其他控件4个方向都是10dp 注意,表示间隔一般用dp为单位
-->
<EditText
android: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)() 的函数
-->
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="点我无返回值的打开"
android:onClick="startActivityNoResult"
/>
<Button
android: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;
// 此处修改为继承自Activity
public class MainActivity extends Activity {
// 对应布局文件中的TextView
EditText txtInput = null;
// 对应布局文件中的点击带返回值的Button
Button btnResult = null;
// 请求码:指定启动源(从当前界面的那个控件部分启动的)
private static final int REQUEST_CODE = 1;
// 用系统生成工具会自动创建如下代码
@Override
protected 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;
}
//使用显式意图激活组件方式如下
//方式1
Intent 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());
//方式2
Bundle bundle=new Bundle();
bundle.putString("text", txtInput.getText().toString());
intent.putExtras(bundle);
// 直接启动Activity
startActivity(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);
//指定哪个启动源启动的目标Activity
if(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">
<!-- 此处同样也用EditText
android:gravity="start" 表示从控件的开始部分显示
android:padding="20dp" 设置内间距为20dp,4个方向都有
-->
<EditText
android: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"/>
<Button
android: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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_on_result);
txtResult = (EditText) this.findViewById(R.id.txt_result);
// 注册点击事件,因为本类实现了OnClickListener接口,故而此处填写this
this.findViewById(R.id.btn_commit).setOnClickListener(this);
}
@Override
public 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);
//销毁当前Actvity
this.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">
<TextView
android: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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ohter);
txtGetContent = (TextView) this.findViewById(R.id.txt_get_content);
// 获取从MainActivity传递过来的数据,注意两边传递的键必须相同,否则此处获取到的将是空
// 得到意图中的数据方式1
String 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" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android: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>
<activity
android:name="com.example.shiyanlou.intentactivity.OnResultActivity"
android:label="@string/title_activity_on_result" >
</activity>
<activity
android: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() {
@Override
public void onClick(View v) {
//设置屏幕为横屏
if(v==butLandscrpe){
MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//设置为置屏幕为竖屏
}else{
MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
};