android activity

来源:互联网 发布:啄木鸟审计软件 编辑:程序博客网 时间:2024/06/06 12:20

在《Android 开发精要》里面是这样介绍Activity的,它把activity称作是构造交互界面。并和Web页面做了对比,个人觉得比较的很恰当:

  1. 从运行模式来看,web页面是通过连接从一个页面跳转到另外一个页面,或者回退到前一个页面,从而构成了一个页面栈。而且在浏览器中,用户可以打开多个tab,但只有一个与用户进行交互。Android的也是这样,多任务,但是负责和用户进行交互的是前台任务的栈顶组件。
  2. 每个Web页面都会有一个或者多个URL进行定位,而且页面切换和数据传输要通过服务器处理,同样,Android的页面组件也是通过类型信息,数据URI信息进行定位,而界面组件的切换和数据传输,都依赖Android组件管理服务统一调度和传递。
  3. Android页面组件和web页面类似,都近似与功能黑盒。完全的黑盒会导致一些共享数据的传输变得记起困难。web开发中会通过Cookie来存储一些状态信息,通过破坏一定的黑盒特征,来换取执行效率。而android的每个应用进程都有一个应用环境对象(Application Context)。小数据量的共享可以通过他来存储。

先理解下概念,然后我们开始了解Activity。

Activity的创建

当你新建一个Android项目的时候,next,next一直next。会给你生成一个MainActivity。这就创建了一个activity。

  1. 这个activity就是把activity_main配置中的内容显示在手机屏幕上。
  2. 自己新建一个activity,不要忘了在AndroidManifest.xml上加上这个activity的声明。

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}}

Activity的配置

当你创建了一个新的activity的时候,要在AndroidManifest.xml中声明这个activity。如果没有声明,程序会在运行的时候报错。

而且里面的有一个Intent-filter,它表示这个activity是这个app的入口。每个app中只能有一个这种配置的activity。


<activity  android:name="com.example.android_intent.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="com.example.android_intent.otherActivity"></activity>

其中:

android.intent.action.MAIN决定应用程序最先启动的Activity。

android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里。

Activity的生命周期

这个文章就特别多了,直接上一个简单的demo

public class MainActivity extends Activity {private static final String TAG = "MainActivty";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.e(TAG, "---> onCreate");}// 销毁前被调用@Overrideprotected void onDestroy() {super.onDestroy();Log.e(TAG, "---> onDestory");}// 暂停前被调用@Overrideprotected void onPause() {super.onPause();Log.e(TAG, "---> onPause");}// stop后重新启动前被调用@Overrideprotected void onRestart() {super.onRestart();Log.e(TAG, "---> onRestart");}// pause后重新获取显示前被调用@Overrideprotected void onResume() {// TODO Auto-generated method stubsuper.onResume();Log.e(TAG, "---> onResume");}// 开始前被调用@Overrideprotected void onStart() {super.onStart();Log.e(TAG, "---> onStart");}// 停止前被调用@Overrideprotected void onStop() {super.onStop();Log.e(TAG, "---> onStop");}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic void onConfigurationChanged(Configuration newConfig) {// TODO Auto-generated method stubsuper.onConfigurationChanged(newConfig);Log.e(TAG, "---> onConfigurationChanged");}}



这个你可以试试一下场景,看看log输出的情况

  1. 打开一个这个app
  2. 按home键
  3. 按home键之后,再次打开这个app
  4. 按home键之后,清楚缓存,再次打开这个app
  5. 点击按钮,跳转到另外一个activity,然后按返回键。
Android 官网的activity生命周期图是必须的。



Activity 需要在各个周期点上负责保管状态、恢复状态、传送资料等工作。

Activity的状态:

Android 的虚拟机(VM)是使用堆栈(Stack based)管理。

Active(活动)

「Active」状态是使用者启动应用程序或Activity 后,Activity 运行中的状态。在Android 平台上,同一个时刻只会有一个Activity 处于活动(Active)或运行(Running)状态。
其他的Activity 都处于未启动(Dead)、停止(Stopped)、或是暂停(Pause)的状态。

Paused(暂停)

「Paused」状态是当Activity 暂时暗下来,退到背景画面的状态。当我们使用Toast、AlertDialog、或是电话来了时,都会让原本运行的Activity 退到背景画面。新出现的Toast、AlertDialog 等界面元件盖住了原来的Activity 画面。Activity 处在「Paused」状态时,使用者无法与原Activity 互动。这个时候就应该保存你的一些数据。

Stopped(停止)

「Stopped」状态是有其他Activity 正在执行,而这个Activity 已经离开荧幕,不再动作的状态。透过长按「Home」钮,可以叫出所有处于「Stopped」状态的应用程序列表。在「Stopped」状态的Activity,还可以透过「Notification」来唤醒。

Dead(已回收或未启动)

「Dead」状态是Activity 尚未被启动、已经被手动终止,或已经被系统回收的状态。要手动终止Activity,可以在程序中呼叫「finish」函式。这个时候断开一些耗时耗电的任务。


Activity的切换

Intent intent = new Intent(MainActivity.this,ThemeDialogActivity.class);startActivity(intent);

Activity之间数据共享

protected String getId() {SharedPreferences sp = this.    getSharedPreferences("test_user_data",Context.MODE_PRIVATE);String id = sp.getString("id", "123456");return id;}protected void setId(String id) {SharedPreferences sp = this.    getSharedPreferences("test_user_data",Context.MODE_PRIVATE);sp.edit().putString("id", id).commit();}


Activity方向和横竖屏切换问题

activity的方向设置

  1. 使用Activity类的setRequestOrientationsetRequestOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE )方法。
  2. 也可以在AndroidManifest.xml文件中的activity标签中设置android:screenOrientation="landscape"。

横竖屏切换问题


当我设置android:screenOrientation="sensor"。依据重力去判断方向的时候。
当横竖屏发生切换log输出:
08-25 23:17:27.965: E/MainActivty(24222): ---> onCreate08-25 23:17:27.965: E/MainActivty(24222): ---> onStart08-25 23:17:27.965: E/MainActivty(24222): ---> onResume08-25 23:17:29.965: E/MainActivty(24222): ---> onPause08-25 23:17:29.965: E/MainActivty(24222): ---> onStop08-25 23:17:29.965: E/MainActivty(24222): ---> onDestory08-25 23:17:30.035: E/MainActivty(24222): ---> onCreate08-25 23:17:30.045: E/MainActivty(24222): ---> onStart08-25 23:17:30.045: E/MainActivty(24222): ---> onResume

当我在ativiy标签中设置android:configChanges="keyboardHidden|orientation|screenSize"后,同时重写onConfigurationChanged方法的时候
public void onConfigurationChanged(Configuration newConfig) {// TODO Auto-generated method stubsuper.onConfigurationChanged(newConfig);Log.e(TAG, "---> onConfigurationChanged");}

当横竖屏发生切换log输出:

08-25 23:23:06.215: E/MainActivty(25898): ---> onCreate08-25 23:23:06.215: E/MainActivty(25898): ---> onStart08-25 23:23:06.215: E/MainActivty(25898): ---> onResume08-25 23:23:07.525: E/MainActivty(25898): ---> onConfigurationChanged


0 0