一:Activity的激活

1、写一个类 extends Activity
Activity是android的四大组件之一。
Activity的激活分为显式意图激活和隐式意图激活。
如果一个activity希望别人隐式意图激活,则要配置过滤器
1 action = "com.shellway.itentab.*"
2 有一个缺省的category,(可以有多个category),若不配置该类型会发生这样的一个错误:Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=cn.itcast.action.main3 }
设置scheme标识如: http:// content:// tel:

隐式意图激活:就是看要要激活的组件里面的intent-filter,看它是如何编写要有action,category,data。

配置意图过滤器就相当于给一个activity取了一个别名。一个activity可以配置多个intent-filter

练习:

package com.shellway.itentab;

import android.support.v7.app.ActionBarActivity;
import android.content.ClipData.Item;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View; public class MainActivity extends ActionBarActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void open(View view){
switch (view.getId()) {
case R.id.bt_open1:
//4种显式意图激活方式
Intent intent1 = new Intent(this,Main2Activity.class);
// intent.setClass(this, Main2Activity.class);
// intent.setClassName(this, "com.shellway.itentab.Main2Activity");
// intent.setClassName("com.shellway.itentab", "com.shellway.itentab.Main2Activity");
startActivity(intent1);
break;
case R.id.bt_open2:
Intent intent2 = new Intent();
//设置动作
intent2.setAction("com.shellway.itent.Main3Activity");
//设置数据
// intent2.setData(Uri.parse("shellway:"));
//设置类型
// intent2.setType("image/jpeg");
//若设置了类型,它就必须和数据一起设置,分开设置不行
intent2.setDataAndType(Uri.parse("shellway:"), "image/jpeg");
startActivity(intent2);
break;
case R.id.bt_open3:
Intent intent3 = new Intent();
intent3.setAction("android.intent.action.VIEW");
intent3.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent3);
break;
default:
break;
} }
}

MainActivity.java

package com.shellway.itentab;

import android.app.Activity;
import android.os.Bundle; public class Main2Activity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
}

Main2Activity.java

package com.shellway.itentab;

import android.app.Activity;
import android.os.Bundle; public class Main3Activity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
}
}

Main3Activity.java

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是第一个activity" />
<Button
android:id="@+id/bt_open1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="open"
android:text="显示意图激活"
/>
<Button android:id="@+id/bt_open2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="open"
android:text="隐式意图激活"
/>
<Button android:id="@+id/bt_open3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="open"
android:text="打开浏览器"
/> </LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="显式意图激活"
/> </LinearLayout>

activity_main2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="隐式意图激活"
/> </LinearLayout>

activity_main3.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.shellway.itentab"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- 第一个activity -->
<activity
android:name=".MainActivity"
android:label="第一个activity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 第二个activity 显式激活-->
<activity android:name=".Main2Activity" android:label="第二个activity" />
<!-- 第三个activity 隐式激活 -->
<activity android:name=".Main3Activity" android:label="第三个activity">
<intent-filter >
<action android:name="com.shellway.itent.Main3Activity" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="shellway" android:mimeType="image/jpeg" />
</intent-filter>
</activity> </application> </manifest>

AndroidMainfest.xml

运行结果截图:

二:Activity之间的数据传输(通过Intent)

1、Bundle 其实是对应HashMap的封装。该类本身实现了Parceleable接口。
同样,我们这里写一个Person类实现Parcelable接口,然后用intent.putExtra(String name, Parcelable value)
和intent.getParcelableExtra(String name)方法来分别存、取对象。

练习(三种数据传输方式):

package com.shellway.domain;

import android.os.Parcel;
import android.os.Parcelable; public class Person implements Parcelable { private int id;
private String name;
private int age; @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
//这里的数据的读取顺序要与声明时的一直
dest.writeInt(id);
dest.writeString(name);
dest.writeInt(age);
}
public static final Parcelable.Creator<Person> CREATOR
= new Parcelable.Creator<Person>() {
public Person createFromParcel(Parcel in) {
//这里返回的是下面带参的出事化后的Person类
return new Person(in);
} public Person[] newArray(int size) {
return new Person[size];
}
};
//这里的数据的初始化顺序要与声明时的一直
public Person(Parcel in){
id = in.readInt();
name = in.readString();
age = in.readInt();
} public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
} @Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}

Person.java

package com.shellway.passdata;

import com.shellway.domain.Person;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.EditText; public class MainActivity extends ActionBarActivity { private EditText et_username;
private EditText et_password; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获得用户输入的数据
et_username = (EditText) findViewById(R.id.et_username);
et_password = (EditText) findViewById(R.id.et_password);
}
public void enter(View view){
String username = et_username.getText().toString();
String password = et_password.getText().toString();
//应用内部的数据传输是通过intent来传输的,它相当于网页中的request对象。
Intent intent = new Intent(this,ReceiveDataActivity.class);
// 1、传输数据的第一种方式
// intent.putExtra("username", username);
// intent.putExtra("password", password);
// 2、传输数据第二种方式
Bundle bundle = new Bundle();
bundle.putString("username", username);
bundle.putString("password", password);
intent.putExtras(bundle);
// 3、传输数据第三种方式,传输对象类型数据.
Person person = new Person(100,"shellway",25);
intent.putExtra("person", person);
//这里是显式激活ReceiveDataActivity
startActivity(intent);
}
}

MainActivity.java

package com.shellway.passdata;

import com.shellway.domain.Person;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView; public class ReceiveDataActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.receive_data);
TextView tv_receive = (TextView) findViewById(R.id.tv_receive);
//获得从上一个activity传过来的数据,谁激活我这个activity就从那个activity传过来。
Intent intent = getIntent();
//从intent对象中拿到数据
// String username = intent.getStringExtra("username");
// String password = intent.getStringExtra("password"); Bundle bundle = intent.getExtras();
String username = bundle.getString("username");
String password = bundle.getString("password"); Person person = intent.getParcelableExtra("person"); //把数据设置到界面上
tv_receive.setText("用户名:"+username+",密 码:"+password
+" \n对象:"+person.toString());
}
}

ReceiveDataActivity.java

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
> <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="用户名" />
<EditText
android:id="@+id/et_username"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="密码" />
<EditText
android:id="@+id/et_password"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入密码"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="enter"
android:text="进入"
/> </LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/tv_receive"
android:layout_width="match_parent"
android:layout_height="match_parent"
/> </LinearLayout>

receive_data.xml

运行结果截图:

2、打开一个Activity返回结果:

分析:

package com.shellway.getdataforresult;

import android.support.v7.app.ActionBarActivity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends ActionBarActivity { private EditText data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
data = (EditText) findViewById(R.id.et_data);
} public void get(View view){
Intent intent = new Intent(this,MainActivity2.class);
//参数100为请求码,标识请求数据来源
startActivityForResult(intent, 100);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
String name = intent.getStringExtra("name");
if (requestCode==100) {
if (intent!=null) {
data.setText(name);
}
}else{
Toast.makeText(this, "获取数据失败", Toast.LENGTH_SHORT).show();
}
}
//若用户在此activity点击返回键,就finish()
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK )
{
// 创建退出对话框
AlertDialog isExit = new AlertDialog.Builder(this).create();
// 设置对话框标题
isExit.setTitle("系统提示");
// 设置对话框消息
isExit.setMessage("确定要退出吗");
// 添加选择按钮并注册监听
isExit.setButton2("取消", listener);
isExit.setButton("确定", listener);
// 显示对话框
isExit.show();
}
return false;
}
/**监听对话框里面的button点击事件*/
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
switch (which)
{
case AlertDialog.BUTTON_POSITIVE:// "确认"按钮退出程序
android.os.Process.killProcess(android.os.Process.myPid()); //获取PID
System.exit(0);
break;
case AlertDialog.BUTTON_NEGATIVE:// "取消"第二个按钮取消对话框
break;
default:
break;
}
}
};
}

MainActivity.java

package com.shellway.getdataforresult;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView; public class MainActivity2 extends Activity {
private ListView lv;
private MyBaseAdapter myBaseAdapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2); myBaseAdapter = new MyBaseAdapter(); lv = (ListView) findViewById(R.id.lv_data);
lv.setAdapter(myBaseAdapter);
lv.setOnItemClickListener(new MyOnItemClickListener());
}
private class MyOnItemClickListener implements OnItemClickListener{ @Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
String name = (String) myBaseAdapter.getItem(position);
Intent intent = new Intent();
intent.putExtra("name", name);
//参数200为结果码,标识返回结果数据来源
setResult(200, intent);
finish();
}
} private class MyBaseAdapter extends BaseAdapter{
String[] data = new String[]{"赵高","刘邦","项羽","楚南公","葛聂"};
@Override
public int getCount() {
return data.length;
} @Override
public Object getItem(int position) {
return data[position];
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv = new TextView(getApplicationContext());
tv.setTextSize(25);
tv.setTextColor(Color.BLUE);
tv.setText(data[position]);
return tv;
}
}
//若用户在此界面直接按返回键,则结束自己 重新开启上一个界面
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if(keyCode == KeyEvent.KEYCODE_BACK){
Intent myIntent = new Intent();
myIntent = new Intent(MainActivity2.this, MainActivity.class);
startActivity(myIntent);
this.finish();
}
return super.onKeyDown(keyCode, event);
}
}

MainActivity2.java

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
> <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="获取的数据:" />
<EditText
android:id="@+id/et_data"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="get"
android:text="获取"
/> </LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <ListView
android:id="@+id/lv_data"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
></ListView> </LinearLayout>

activity_main2.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.shellway.getdataforresult"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.RESTART_PACKAGES"/> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity2" android:label="数据列表"/>
</application> </manifest>

AndroidManifest.xml

点击获取后的结果截图:

三、Activity的作用:
起显示作用,他是用来和用户交互的。也是一个view的容器
1 完整的生命周期:
onCreate() --> onStart() --> onResume() activiyt已经正常显示
点击回退键
onPause() --> onStop() --> onDetroy()

2、可视的生命周期
onCreate() --> onStart() --> onResume() activiyt已经正常显示
打开一个activity。该activity完全覆盖上一个activity
onPause() ---> onStop()
点击回退键
onRestart() --> onStart() ---> onResume()
点击回退键
onPause() --> onStop() --> onDetroy()

3、前台生命周期
首先把第二个Activity配置:android:theme="@android:style/Theme.Dialog"
就可以把activity变成对话框的效果,注意:如果在一个Activity中弹出对话框,则不会执行任何一个方法。
onCreate() --> onStart() --> onResume() activiyt已经正常显示
打开一个activity。该activity没有完全覆盖上一个activity
onPause()
点击回退键
onResume()

横竖屏切换的时候:
竖屏到横屏:activity首先被销毁,在创建一个新的activity
横屏到竖屏:activity首先被销毁,再创建一个新的activity,再把该activity销毁,再创建一个新的activity.(是由于输入法的影响)

生命周期代码:

package com.shellway.lifecycle;

import android.support.v7.app.ActionBarActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View; public class MainActivity extends ActionBarActivity { private static final String TAG = "MainActivity"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, " onCreate "); } public void open1(View view){
Intent intent = new Intent(this,MainActivity.class);
startActivity(intent);
}
public void open2(View view){
Intent intent = new Intent(this,Main2Activity.class);
startActivity(intent);
} @Override
protected void onStart() {
super.onStart();
Log.i(TAG, " onStart ");
} @Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, " onRestart ");
} @Override
protected void onResume() {
super.onResume();
Log.i(TAG, " onResume ");
} @Override
protected void onPause() {
super.onPause();
Log.i(TAG, " onPause ");
} @Override
protected void onStop() {
super.onStop();
Log.i(TAG, " onStop ");
} @Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, " onDestroy ");
} }

MainActivity.java

package com.shellway.lifecycle;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View; public class Main2Activity extends Activity {
private static final String TAG = "MainActivity"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
} public void open1(View view){
Intent intent = new Intent(this,MainActivity.class);
startActivity(intent);
} public void open2(View view){
Intent intent = new Intent(this,Main2Activity.class);
startActivity(intent);
}
}

Main2Activity.java

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="open1"
android:text="打开A界面"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="open2"
android:text="打开B界面"
/> </LinearLayout>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="open1"
android:text="打开A界面"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="open2"
android:text="打开B界面"
/> </LinearLayout>

activity_main2.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.shellway.lifecycle"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="第一个Activity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Main2Activity" android:label="第二个Activity"
android:theme="@android:style/Theme.Dialog"/>
</application> </manifest>

AndroidManifest.xml

4、任务栈task、进程Process 

task的作用:就是用来管理activity的进入,退出。记录了用户的行为。
位于任务栈栈顶的activity就是和用户交互的。
任务栈里面存放的是:activity的引用

下面详细介绍activity的四种启动模式:

1、standard
    standard模式是默认的启动模式,不用为<activity>配置android:launchMode属性即可,当然也可以指定值为standard。
    standard模式是所启动的Activity都是在同一个task容器栈下,不会重新创建新的task容器栈。先压入栈的Activity实例按顺序入栈底,后入栈在栈顶,处于栈的顶部Activity实例处于活动状态,其他处于非活动状态。按物理返回键,退出当前所处活动状态Activity窗口,这样就会从task容器栈中弹出,显示在手机主屏幕上,从而,有非活动状态转换成活动的状态。其次,standard容器栈可能会存在着相同的Activity实例,只有没调用一次startActivity方法,就会创建目标Activity实例对象压入task容器栈。

2、singleTop
    AndroidManifest.xml文件中<activity>launchmode属性配置singletop,那么启动实例化Activity,如果task容器栈顶存在已经激活的Activity实例,就会重用当前栈顶的Activity实例,不会再重新去实例化Activity对象。善于思考的朋友可能会问,如果要启动的目标Activity已经有实例化对象存在task容器栈里面,只是现在不处于栈顶,这样情况下,singletop启动模式会创建目标Activity实例吗?答案是肯定的。要启动的目标Activity实例正好处于栈顶,才能重用该实例,其他情况必须创建新实例。

3、singleTask
singletask模式,特别需要注意了。启动的目标Activity实例如果已经存在task容器栈中,不管当前实例处于栈的任何位置,是栈顶也好,栈底也好,还是处于栈中间,只要目标Activity实例处于task容器栈中,都可以重用该Activity实例对象,然后,把处于该Activity实例对象上面全部Activity实例清除掉,并且,task容器栈中永远只有唯一实例对象,不会存在两个相同的实例对象。所以,如果你想你的应用不管怎么启动目标Activity,都只有唯一一个实例对象,就使用这种启动模式。

4、singleInstance
singleInstance启动模式,简单说就是可以共享某个Activity。比如,应用1的任务容器栈中创建了MainActivity实例,应用2也要激活MainActivity,则不需要创建MainActivity实例,直接可以公用MainActivity实例。尤其值得注意:应用1启动MainActivity,按home键;打开应用2启动应用1的MainActivity实例。在按home键,打开应用1,这时候应用1的界面是应该是处于MainActivity界面实例。

5、理解一些概念
进程:是一个应用程序运行的空间。一个android应用就是一个进程。进程就有他自己的内存空间。
一个进程里面可以有多个线程。在两个进行之间进行切换是非常好性能。
线程:一个控件单元。
一个task可以对应多个进程。
每个activity的实例是运行在自己的进程里面。
activity程序默认是一个单独的线程里面来运行。onCreate() 按钮点击回调事件、对于显示的操作都是在主线程里面运行即:UI线程。对于那些耗时的操作不适宜放在主线程里面执行,比如
联网获取数据、大文件的拷贝,都需要放置在子线程来操作。
在子线程里执行耗时操作后获得数据后要更新主界面,可以通过消息机制来解决,因为只有主线程才能对显示进行操作。,否则会报一下错误:
08-29 08:07:41.200: E/AndroidRuntime(1327):
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Handler :用于子线程和主线程之前的通信。
采用是就消息模式,当子线程完成操作,给主线程发送消息。让主线程来处理显示的更新。
子线程和主线程之前的通信练习:

package com.shellway.changeview;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView; public class MainActivity extends ActionBarActivity { protected static final int CHANGE_UI = 0;
private TextView tv; Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case CHANGE_UI:
int i = (Integer) msg.obj;
tv.setText(i+"");//设置显示信息,注意是String类型
break;
default:
break;
}
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv_number);
} public void add(View view){
new Thread(){
public void run() {
int i = 0;
while (i<20) {
i = i + 1;
SystemClock.sleep(300);//每0.3秒执行一次
//创建一个消息对象来传递数据
Message msg = new Message();
//标识消息对象类型
msg.what = CHANGE_UI;
//封装数据到消息对象
msg.obj = i;
//发送消息对象
handler.sendMessage(msg);
}
};
}.start();
}
}

MainActivity.java

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
> <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="自动增加的数据:" />
<TextView
android:id="@+id/tv_number"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="0" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="add"
android:text="增加"
/> </LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.shellway.changeview"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="子线程通过消息更新界面数据" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

AndroidManifest.xml

运行结果截图:

6:五种对话框
对话框的创建采用的是构建器模式:

package com.shellway.mydialog;

import android.support.v7.app.ActionBarActivity;
import android.text.AlteredCharSequence;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast; public class MainActivity extends ActionBarActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} /**普通对话框
* 步骤: 1、创建构建器
* 2、给构建器设置属性: 标题 、内容、按钮
* 3、创建dialog
* 4、显示对话框
*/
public void generalDialog(View view){
//创建构建器
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(false);//使物理回退键失效
builder.setTitle("shellway的博客");
builder.setMessage("你会经常来看我的博客吗?");
//设置按钮监听事件
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { }
});
//设置按钮监听事件
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) { }
}); //创建dialog,并显示
Dialog dialog = builder.create();
dialog.show();
} //选择对话框
public void selectedDialog(View view){
final String[] items = new String[]{"公子扶苏","李斯","张良"};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(false);//使物理回退键失效
builder.setTitle("shellway的博客");
//设置点击监听事件
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(), items[which], 0).show();
}
}); //创建dialog,并显示
Dialog dialog = builder.create();
dialog.show();
} //单选对话框
public void singleChoiceDialog(View view){
final String[] items = new String[]{"公子扶苏","李斯","张良"};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(false);//使物理回退键失效
builder.setTitle("shellway的博客");
//设置点击监听事件
builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(), items[which], 0).show();
}
});
//设置确定按钮监听事件
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
}); //创建dialog,并显示
Dialog dialog = builder.create();
dialog.show();
} //多选对话框
public void multiChoiceDialog(View view){
final String[] items = new String[]{"公子扶苏","李斯","张良"};
final boolean[] flag = new boolean[]{true,false,false};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(false);//使物理回退键失效
builder.setTitle("shellway的博客");
//设置点击监听事件
builder.setMultiChoiceItems(items, flag, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
// TODO Auto-generated method stub }
});
//设置确定按钮监听事件
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
StringBuilder sb = new StringBuilder(); for (int i = 0; i < items.length; i++) {
if(flag[i]){
sb.append(items[i]+" ");
}
}
String info =sb.toString();
Toast.makeText(getApplicationContext(), info, 0).show();
}
}); //创建dialog,并显示
Dialog dialog = builder.create();
dialog.show();
} //自定义对话框
public void customDialog(View view){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(false);//使物理回退键失效
builder.setTitle("shellway的博客");
//加载自定义布局文件
LayoutInflater mInflater = LayoutInflater.from(this);
View dialogView = mInflater.inflate(R.layout.custom, null);
builder.setView(dialogView);
//创建dialog
final Dialog dialog = builder.create();
dialog.show();
Button bt_ok = (Button) dialogView.findViewById(R.id.bt_ok);
Button bt_cancel = (Button) dialogView.findViewById(R.id.bt_cancel);
//设置按钮监听事件
bt_ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();//让对话框消失
}
} );
//设置按钮监听事件
bt_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();//让对话框消失
}
} );
}
}

MainActivity.java

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="generalDialog"
android:text="普通对话框"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="selectedDialog"
android:text="选择对话框"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="singleChoiceDialog"
android:text="单选对话框"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="multiChoiceDialog"
android:text="多选对话框"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="customDialog"
android:text="自定义对话框"
/> </LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入密码"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请再次输入密码"
/> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/bt_ok"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="ok"
android:text="确定"
/>
<Button
android:id="@+id/bt_cancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="cancel"
android:text="取消"
/> </LinearLayout> </LinearLayout>

custom.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.shellway.mydialog"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

AndroidManifest.xml

运行结果截图:

 注意啦:本章复习笔记未完,后面会继续更新完善。。。。。。

java攻城狮之路(Android篇)--Activity生命的更多相关文章

  1. java攻城狮之路(Android篇)--MP3 MP4、拍照、国际化、样式主题、图片移动和缩放

    一.MP3播放器 查看Android API文档可以看到MediaPlayer状态转换图: 练习: package com.shellway.mp3player; import java.io.Fil ...

  2. java攻城狮之路(Android篇)--BroadcastReceiver&Service

    四大组件:activity 显示. contentProvider 对外暴露自己的数据给其他的应用程序.BroadcastReceiver 广播接收者,必须指定要接收的广播类型.必须明确的指定acti ...

  3. java攻城狮之路(Android篇)--ListView与ContentProvider

    一.ListView 1.三种Adapter构建ListView ListView添加条目的时候, 可以使用setAdapter(ListAdapter)方法, 常用的ListAdapter有三种 B ...

  4. java攻城狮之路(Android篇)--SQLite

    一.Junit    1.怎么使用        在AndroidManifest.xml文件中进行配置, 在manifest借点下配置instrumentation, 在application借点下 ...

  5. java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单

    一.widget:桌面小控件1 写一个类extends AppWidgetProvider 2 在清单文件件中注册: <receiver android:name=".ExampleA ...

  6. java攻城狮之路(Android篇)--与服务器交互

    一.图片查看器和网页源码查看器 在输入地址的是不能输入127.0.0.1 或者是 localhost.ScrollView :可以看成一个滚轴 可以去包裹很多的控件在里面 练习1(图片查看器): pa ...

  7. java攻城师之路(Android篇)--搭建开发环境、拨打电话、发送短信、布局例子

    一.搭建开发环境 1.所需资源 JDK6以上 Eclipse3.6以上 SDK17, 2.3.3 ADT17 2.安装注意事项 不要使用中文路径 如果模拟器默认路径包含中文, 可以设置android_ ...

  8. java攻城狮之路--复习xml&dom_pull编程续

    本章节我们要学习XML三种解析方式: 1.JAXP DOM 解析2.JAXP SAX 解析3.XML PULL 进行 STAX 解析 XML 技术主要企业应用1.存储和传输数据 2.作为框架的配置文件 ...

  9. java攻城狮之路--复习xml&dom_pull编程

    xml&dom_pull编程: 1.去掉欢迎弹窗界面:在window项的preferences选项中输入“configuration center” 找到这一项然后     把复选框勾去即可. ...

随机推荐

  1. Atitit. 高级软件工程师and 普通的区别 高级编程的门槛总结

    Atitit.  高级软件工程师and 普通的区别 高级编程的门槛总结 1. 完备的知识体系 2 2. 编程理论/原理的掌握 2 1.1. 掌握常用的概念(ORM,IOC,AOP,event driv ...

  2. atitit.gui界面纵向居中总结

    atitit.gui界面纵向居中总结 1.table法...这个简单.. 表格设置100%高度,<td align="center" valign="middle& ...

  3. atitit.dw不能显示正确的百分比高度in dw的解决

    atitit.dw不能显示正确的百分比高度in dw的解决 div 设置35%的高度,三,不能正确的显示高度...环境dw cs6 但是设置161px奏能ok了...表明这个是dw的一个bug... ...

  4. iOS----友盟分享完善版本

    分享 详细集成 注意:1.线上集成文档的示例代码对应的是最新版本的SDK,如果你所用的SDK版本类名或者方法名与此文档不符合,请看随包里面的线下文档或者下载使用最新版本的SDK. 设置友盟appkey ...

  5. iOS开发-友盟分享(1)

    1.集成友盟分享,需要先注册一个友盟账号,注册地址 友盟开发者平台官网  友盟集成文档 友盟sdk下载地址友盟sdk下载地址 2,成功下载sdk集成后,微信分享需要配置一下 新浪微博 之类到同样配置就 ...

  6. 安装Ubuntu14.04版本的操作系统

    1:安装好虚拟机之后便是安装操作系统,操作系统分为好多种,在这里笔者使用的是Ubuntu14.04版本的操作系统,除此之后还可以使用fedora或者小红帽等等操作系统 软件包http://pan.ba ...

  7. 我和Java的故事-------第1弹

    前言:兴趣是学习任何新知识最好的老师 --------------------------------------------------------------------------------- ...

  8. oracle--创建表空间、用户名、密码

    原文链接:http://blog.sina.com.cn/s/blog_4ce992f40101cspr.html

  9. PHP类与面向对象(二)

    构造函数和析构函数 构造函数PHP 5 允行开发者在一个类中定义一个方法作为构造函数.具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作.如果子类中定义了构造 ...

  10. SAP Business One SAP B1功能概述

    SAP Business One SAP B1功能概述 SAP B One配有易于使用的软件界面,是一款全面的,多功能的业务管理解决方案,贵企业可以将其用作主要的企业资源(ERP)应用程序. 该解决方 ...