1.Activity概述
2.状态与生命周期概述
3.状态与生命周期详解
package com.example.administrator.myapplication;
import android.app.Activity;
import android.os.Bundle;
/*Activity三个状态和七大生命周期方法分析*/
public class MainActivity extends Activity {
//activity创建时第一个调用的方法,通常我们在该方法中加载布局文件,初始化UI组件,事件注册等等
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("MainActivity-onCreate");
}
/*在onCreate之后调用,用于显示界面,但用户还不能进行交互*/
@Override
protected void onStart() {
super.onStart();
System.out.println("MainActivity-onStart");
}
/*当一个stopped状态的Activity被返回时调用,之后再调用onStart)方法,进入运行状态*/
@Override
protected void onRestart() {
super.onRestart();
System.out.println("MainActivity-onRestart");
}
/*在onStart后调用,该方法执行完成后,用户可以进行交互,当前Activity进入resume的状态(运行状态)
* 当一个paused状态的activity被重新返回时,会再次调用该方法,让Activity进入运行状态
* */
@Override
protected void onResume() {
super.onResume();
System.out.println("MainActivity-onResume");
}
/*当其他Activity(透明或窗口模式)进入时,该方法被调用,让当前Activity进入paused(暂停)状态
* 当前Activity还可见,但不可进行交互,如果其他更高优先级的APP需要内存时,当前Activity可能会被销毁(kill)
* 当前Activity被返回时会调用onResume()方法
* */
@Override
protected void onPause() {
super.onPause();
System.out.println("MainActivity-onPause");
}
/*当其他Activity完全覆盖该Activity时,会被调用,当前Activity进入stopped状态(停止状态)
* 当前Activity不可见,不可进行交互,如果其他更高优先级的APP需要内存时,当前Activity可能会被销毁(kill)
* 当前Activity被返回时会调用onRestart()方法
* */
@Override
protected void onStop() {
super.onStop();
System.out.println("MainActivity-onStop");
}
/*当前Activity被销毁时调用,通常在该方法中用来释放资源,当前Activity killed*/
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("MainActivity-onDestroy");
}
}
4.传递简单数据
Dog.java
package com.example.administrator.myapplication;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by Administrator on 2016/3/17.
*/
//打包裹 传递对象 性能好
public class Dog implements Parcelable{
String name;
int age;
String type;
@Override
public String toString() {
return "Dog{" +
"age=" + age +
", name='" + name + '\'' +
", type='" + type + '\'' +
'}';
}
//描述内容
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
//把传递数据写进dest
dest.writeString(name);
dest.writeInt(age);
dest.writeString(type);
}
//对象的创建器 序列化包裹
public static final Parcelable.Creator<Dog> CREATOR
=new Parcelable.Creator<Dog>()
{
@Override
public Dog createFromParcel(Parcel in) {
Dog dog=new Dog();
dog.name=in.readString();
dog.age=in.readInt();
dog.type=in.readString();
return dog;
}
@Override
public Dog[] newArray(int size) {
return new Dog[size];
}
};
}cat.java
package com.example.administrator.myapplication;
import java.io.Serializable;
/**
* Created by Administrator on 2016/3/17.
*/
//可序列化 IO序列化 性能比较低
public class Cat implements Serializable {
String name;
int age;
String type;
@Override
public String toString() {
return "Cat{" +
"age=" + age +
", name='" + name + '\'' +
", type='" + type + '\'' +
'}';
}
}activity_main_a.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.myapplication.MainActivityA">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:hint="请输入信息..."
android:id="@+id/editText_info"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送"
android:id="@+id/button"
android:onClick="sendClick"
android:layout_below="@+id/editText_info"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="传递对象1"
android:id="@+id/button_obj"
android:onClick="sendObjClick"
android:layout_below="@+id/button"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/button"
android:layout_alignEnd="@+id/button" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="传递对象2"
android:id="@+id/button_obj2"
android:onClick="sendObj2Click"
android:layout_below="@+id/button_obj"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>MainActivityA.java
package com.example.administrator.myapplication;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivityA extends Activity {
private EditText editText_info;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_a);
editText_info = (EditText) findViewById(R.id.editText_info);
}
/*启动ActivityB,并且要传递数据*/
public void sendClick(View v) {
//创建一个意图(想干什么) 参数:上下文,要跳转的组件的字节码
Intent intent = new Intent(this, MainActivityB.class);
String info = editText_info.getText().toString();
//封装要传递的数据,第一种方法
/* Bundle data = new Bundle();
data.putString("info", info);
intent.putExtra("data",data);*/
//第二种方法
intent.putExtra("info", info);
intent.putExtra("age", 24);
startActivity(intent);
}
public void sendObjClick(View v) {
//用IO消耗的性能比较多
//要传递的对象
Cat cat = new Cat();
cat.name = "皮卡丘";
cat.age = 2;
cat.type = "英短";
Intent intent = new Intent(this, MainActivityB.class);
intent.putExtra("cat", cat);
startActivity(intent);
}
public void sendObj2Click(View v) {
//Parcelable
Dog dog = new Dog();
dog.name="旺旺";
dog.age=1;
dog.type="金毛";
Intent intent = new Intent(this, MainActivityB.class);
intent.putExtra("dog",dog);
startActivity(intent);
}
}activity_main_b.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.myapplication.MainActivityB">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/info"/>
</RelativeLayout>MainActivityB.java
package com.example.administrator.myapplication;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivityB extends ActionBarActivity {
private TextView textView_info;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_b);
textView_info = (TextView) findViewById(R.id.info);
//intent内容一样 不是一个intent
Intent intent = getIntent();
//第一种
/* Bundle data = intent.getBundleExtra("data");
String info = data.getString("info");
textView_info.setText(info);*/
//第二种
String info = intent.getStringExtra("info");
//第二个参数为默认值
int age = intent.getIntExtra("age", 18);
Cat cat = (Cat) intent.getSerializableExtra("cat");
// Dog dog = intent.getParcelableExtra("dog");
// textView_info.setText(info + "---" + age );
textView_info.setText(info + "---" + age + "--" + cat.toString()+"\n");
// textView_info.setText(dog.toString());
}
}5.传递自定义对象数据
6.处理返回结果
activity_main_activity_result.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.myapplication.MainActivityResult">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:hint="请选择一个电话号码"
android:id="@+id/editText_number"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SELECT"
android:id="@+id/button_select"
android:onClick="selectClick"
android:layout_below="@+id/editText_number"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="CALL"
android:onClick="callClick"
android:id="@+id/button2_call"
android:layout_below="@+id/button_select"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/button_select"
android:layout_alignEnd="@+id/button_select" />
</RelativeLayout>MainActivityResult.java
package com.example.administrator.myapplication;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivityResult extends ActionBarActivity {
private static final int REQUESTCODE_1 = 0x1;
private EditText editText_number;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_activity_result);
editText_number = (EditText) findViewById(R.id.editText_number);
}
/*选择一个电话号码*/
public void selectClick(View v) {
Intent intent = new Intent(this, PhoneNumberListActivity.class);
//返回结果 第一个参数 intent 第二个参数 请求编码
startActivityForResult(intent, REQUESTCODE_1);
}
//重写该方法来处理返回的结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUESTCODE_1 && resultCode == RESULT_OK) {
String number = data.getStringExtra("number");
editText_number.setText(number);
}
}
/*拨打电话*/
public void callClick(View v) {
String number=editText_number.getText().toString();
Intent intent=new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+number));
startActivity(intent);
}
}activity_phone_number_list.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.myapplication.PhoneNumberListActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>PhoneNumberListActivity.java
package com.example.administrator.myapplication;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class PhoneNumberListActivity extends ActionBarActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_phone_number_list);
listView= (ListView) findViewById(R.id.listView);
final String[] numbers={"13713820115","13692208307","13760359165","15817447169","13713686009"};
ArrayAdapter<String> adapter=new ArrayAdapter<String>
(this,android.R.layout.simple_list_item_1,android.R.id.text1,numbers);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String number=numbers[position];
Intent intent=new Intent();
intent.putExtra("number",number);
setResult(RESULT_OK,intent);//设置返回结果
finish();//结束当前界面
}
});
}
}
//最后要在清单文件配置打电话权限
<uses-permission android:name="android.permission.CALL_PHONE" />
7.屏幕方向与显示方式
横屏android:screenOrientation="landscape"
竖屏android:screenOrientation="portrait"设置主题全屏 android:theme="@android:style/Theme.DeviceDefault.NoActionBar.Fullscreen"
activity_screen_orientation.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.myapplication.ScreamOrientationActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="屏幕方向测试"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>ScreamOrientationActivity.java
package com.example.administrator.myapplication;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
/*设置全屏模式
* 1.通过代码实现
* 2.在清单文件中可以通过设置Activity的主题:
* android:theme="@android:style/Theme.DeviceDefault.NoActionBar.Fullscreen"
*
* 设置窗体模式
* 1.在清单文件中设置主题:
* android:theme="@android:style/Theme.DeviceDefault.Dialog"
* */
public class ScreamOrientationActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//通过代码设置屏幕方向
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//设置全屏
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
//去除标题栏
// requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_scream_orientation);
}
}
8.屏幕方向旋转
android:configChanges="keyboard|orientation|screenSize"
当配置了android:configChanges="orientation"属性,在横紧屏切换的时候不会重新执行Activity的onCreate方法,只是执行onConfigurationChanged方法,否则切换的时候会重新执行onCreate方法
activity_screen_change.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.myapplication.ScreenChangeActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:hint="请输入信息"
android:id="@+id/editText_info"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="change"
android:onClick="changeClick"
android:id="@+id/button_change"
android:layout_below="@+id/editText_info"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>竖屏文件放在layout-land目录
ScreenChangeActivity.java
package com.example.administrator.myapplication;
import android.app.Activity;
import android.content.res.Configuration;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
/*屏幕切换默认情况下会重新创建Activity
* 为了保存当前Activity的状态,我们可以重写onSaveInstanceState方法来保存相关数据
* 然后在onCreate方法中还原数据*/
public class ScreenChangeActivity extends Activity {
int index = 0;
//横屏竖屏状态要保存下来
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_screen_change);
System.out.println("ScreenChangeActivity--onCreate");
//还原状态值
if (savedInstanceState != null) {
index = savedInstanceState.getInt("index", 0);
}
}
public void changeClick(View v) {
index++;
System.out.println("index=" + index);
}
//切换屏保存状态
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
System.out.println("onSaveInstanceState");
outState.putInt("index", index);
}
//改变布局排版配置
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
System.out.println("onConfigurationChanged");
}
}AndroidManifest.xml
<activity
android:name=".ScreenChangeActivity"
android:configChanges="keyboard|orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
9.SharedPreferences
activity_share_preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.myapplication.SharePreferencesActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button2"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/editText_msg"
android:hint="请输入消息"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_above="@+id/button2" />
</RelativeLayout>
SharePreferencesActivity.java
package com.example.administrator.myapplication;
import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.EditText;
public class SharePreferencesActivity extends ActionBarActivity {
private SharedPreferences sp;
private EditText editText_msg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_share_preferences);
editText_msg= (EditText) findViewById(R.id.editText_msg);
//获取当前程序的SharedPreferences对象
sp = getSharedPreferences("msg", Context.MODE_PRIVATE);
}
//还原数据
@Override
protected void onResume() {
super.onResume();
editText_msg.setText(sp.getString("msg", ""));
//删除数据
SharedPreferences.Editor editor=sp.edit();
editor.remove("msg");
editor.commit();
}
//我们在该事件方法里来存储数据
@Override
protected void onPause() {
super.onPause();
String msg=editText_msg.getText().toString();
if(TextUtils.isEmpty(msg))
{
return;
}
SharedPreferences.Editor editor= sp.edit();
editor.putString("msg",msg);
editor.commit();//提交
}
}