任何程序都是静态代码,我们把这些静态代码打包好,然后放到运行环境当中,通过事件流的驱动使这些代码运行起来。Android的环境也不例外。
静态的代码,在动态事件的驱动下,才会有效的运转起来。
驱动Android程序运行起来的事件大致可以分为以下几种:
用户事件:如点击屏幕,滑动等各种手势;
系统事件:如屏幕方向的转变;
线程通讯事件:线程之间互发消息,程序根据消息内容进行相应的响应;
进程通讯事件:这里的进程包括本程序开启的进程,也包括其他应用程序的进程。
下面来介绍动态事件驱动的第二种:系统事件
系统事件流
有时候,我们可能需要让应用程序监听系统设置的更改,对系统设置的更改做出响应。
这个时候就不得不提Configuration类了,它是专门用于手机设备上配置信息的类。
程序可以通过调用Ativity的如下方法获取系统的Configuration对象:
Configuration cfg = getResources().getConfiguration();
Configuration类的对象可以查看很多关于手机配置的信息,这里不是我们讨论的重点。我们主要关注的是手机配置的信息变化之后,如何通过代码来进行响应。
这时候就不得不提一个回调方法onConfigurationChanged方法(关于回调和监听的区别,我在上篇文章中有所介绍,这里不在赘述),重写Activity的onConfigurationChanged方法响应系统设置的更改。
我们以屏幕方向转变为例,来介绍如何如何通过代码来进行响应。
具体可以参考以下代码:
mport android.app.Activity;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bn = (Button) findViewById(R.id.bn);
// 为按钮绑定事件监听器
bn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View source) {
Configuration config = getResources().getConfiguration();
// 如果当前是横屏
if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// 设为竖屏
<strong>MainActivity.this.setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);</strong>
}
// 如果当前是竖屏
if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {
// 设为横屏
MainActivity.this.setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
});
}
// 重写该方法,用于监听系统设置的更改,主要是监控屏幕方向的更改
@Override
public void onConfigurationChanged(Configuration newConfig)
{
<strong>super.onConfigurationChanged(newConfig);
String screen = newConfig.orientation ==
Configuration.ORIENTATION_LANDSCAPE ? "横向屏幕" : "竖向屏幕";
Toast.makeText(this, "系统的屏幕方向发生改变" + "\n修改后的屏幕方向为:"
+ screen, Toast.LENGTH_LONG).show();</strong>
}
}
当然要在AndroidManifest.xml中设置MainActivity监听屏幕方向改变的事件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.crazyit.event" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- 设置Activity可以监听屏幕方向改变的事件 -->
<activity
<strong>android:configChanges="orientation|screenSize"</strong>
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>
具体界面部分的代码不再详述,效果就是屏幕方向改变后,会弹出提示信息。
下篇将介绍动态事件驱动的第三种:线程通讯事件