首页 技术 正文
技术 2022年11月19日
0 收藏 744 点赞 2,486 浏览 28979 个字

一: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

练习:

java攻城狮之路(Android篇)–Activity生命java攻城狮之路(Android篇)–Activity生命

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

运行结果截图:

java攻城狮之路(Android篇)–Activity生命java攻城狮之路(Android篇)–Activity生命java攻城狮之路(Android篇)–Activity生命

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

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

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

java攻城狮之路(Android篇)–Activity生命

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

运行结果截图:

java攻城狮之路(Android篇)–Activity生命java攻城狮之路(Android篇)–Activity生命

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

分析:

java攻城狮之路(Android篇)–Activity生命

java攻城狮之路(Android篇)–Activity生命java攻城狮之路(Android篇)–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

点击获取后的结果截图:

java攻城狮之路(Android篇)–Activity生命java攻城狮之路(Android篇)–Activity生命

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

java攻城狮之路(Android篇)–Activity生命

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

java攻城狮之路(Android篇)–Activity生命

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

java攻城狮之路(Android篇)–Activity生命java攻城狮之路(Android篇)–Activity生命

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

生命周期代码:

java攻城狮之路(Android篇)–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

java攻城狮之路(Android篇)–Activity生命

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实例正好处于栈顶,才能重用该实例,其他情况必须创建新实例。

java攻城狮之路(Android篇)–Activity生命

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

java攻城狮之路(Android篇)–Activity生命

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

java攻城狮之路(Android篇)–Activity生命

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

java攻城狮之路(Android篇)–Activity生命

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

运行结果截图:

java攻城狮之路(Android篇)–Activity生命

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

java攻城狮之路(Android篇)–Activity生命java攻城狮之路(Android篇)–Activity生命

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生命java攻城狮之路(Android篇)–Activity生命

java攻城狮之路(Android篇)–Activity生命java攻城狮之路(Android篇)–Activity生命

java攻城狮之路(Android篇)–Activity生命java攻城狮之路(Android篇)–Activity生命

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,085
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,560
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,409
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,182
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,819
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,902