Activity

 

package hyz.com;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ActivityTestActivity extends Activity implements OnClickListener
{
	private Button bt;
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        Log.i("hyz", "onCreate(从书架取第一本书)");
        setContentView(R.layout.main);
        bt = (Button)findViewById(R.id.bt);
        bt.setOnClickListener(this);
    }

	@Override
	protected void onStart() 
	{
		Log.i("hyz", "onStart(把第一书放到桌上)");
		super.onStart();
	}

	@Override
	protected void onRestart() 
	{
		Log.i("hyz", "onRestart(。。。)");
		super.onRestart();
	}

	@Override
	protected void onResume()
	{
		Log.i("hyz", "onResume(打开第一本书)");
		super.onResume();
	}

	@Override
	protected void onPause() 
	{
		Log.i("hyz", "onPause(合上第一本书)");
		super.onPause();
	}

	@Override
	protected void onStop() 
	{
		Log.i("hyz", "onStop(第二本书完全遮盖了第一本书,没有遮盖就不会调用)");
		super.onStop();
	}

	@Override
	protected void onDestroy() 
	{
		Log.i("hyz", "onDestroy(第一本书放回书架)");
		super.onDestroy();
	}

	@Override
	public void onClick(View v) 
	{
		Intent intent = new Intent();
		intent.setClass(this, ActivityTestActivity.class);
		startActivity(intent);
	}    
}
package hyz.com;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class ActivityTestActivity2 extends Activity 
{
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        Log.i("hyz", "onCreate2(从书架取第二本书)");
        setContentView(R.layout.main2);
    }

	@Override
	protected void onStart() 
	{
		Log.i("hyz", "onStart2(把第二本书放桌上)");
		super.onStart();
	}

	@Override
	protected void onRestart() 
	{
		Log.i("hyz", "onRestart2()");
		super.onRestart();
	}

	@Override
	protected void onResume()
	{
		Log.i("hyz", "onResume2(打开第二本书)");
		super.onResume();
	}

	@Override
	protected void onPause() 
	{
		Log.i("hyz", "onPause2()");
		super.onPause();
	}

	@Override
	protected void onStop() 
	{
		Log.i("hyz", "onStop2()");
		super.onStop();
	}

	@Override
	protected void onDestroy() 
	{
		Log.i("hyz", "onDestroy2()");
		super.onDestroy();
	}
    
}



 

 

 

 

 

 

生命周期某仁兄形象举例:

我们把Activity比作一本书,我们要看书,首先从书架上取出书(onCreate),然后放到桌上(onStart),接着打开书(onResume),这样我们就可以看书并可以在书本上写字了。

如果这时候我们要启动另一个Activity,也就是要看另一本书,首先我们放下手中的笔或者说合上书(onPause),然后从书架上拿下另一本书(书2:onCreate),然后把书本2放到桌上并打开(书2:onStart、onResume)。

如果书本1被书本2完全盖住了,即不可见了,就调用书本1的onStop;而如果书本2较小,没有完全盖住书本1,则不会调用。

我们还可以把书本1放回书架上,即onDestroy。

另外,还有一点要注意,Activity在处于onPause、onStop、onDestroy状态下,系统都可以销毁该Activity所在进程,所以我们在处理一些要保存的数据时,必须在onPause方法中进行,因为onStop和onDestroy方法不一定会被调用。

 

 

 

public boolean onKeyDown (int keyCode, KeyEvent event) :捕捉手机键盘被按下的事件。

在Android的程序中Activity代表手机屏幕的一屏

 

protected void onCreate(Bundle savedInstanceState);

 //第一次调用一个Activity时就会执行此方法

protected void onStart();

//当某个activity处于可见的状态时就会调用此方法

protected void onResume();

//如果此Activity又可以获得用户的焦点,即at the top of the activity stack,就会调用此方法

//以上3个方法就可以使用一个activitie了

protected void onRestart();

protected void onPause();

protected void onStop();

当启动第二个Activity时,就会调用前一个activity的onPause()方法,使其处于暂停状态

让后依次调用第二个activity的onCreate->onStart->onResume,让后调用第一个activity 的onStop.

然后从第二个activity回到第一个activity,就会调用第一个activity的onRestart(),因为第一个activity仅仅stop,并未销毁,然后调用onResume,就可以显示出来了。返回第一个activity时,调用第二个activity的onStop->onDestroy,就可以销毁

protected void onDestroy();

 

FirstActivity--->onCreate

FirstActivity--->onStart

FirstActivity--->onResume

FirstActivity--->onPause

SecondActivity--->onCreate

SecondActivity--->onStart

SecondActivity--->onResume

FirstActivity--->onStop

SecondActivity--->onPause

FirstActivity--->onRestart

FirstActivity--->onStart

FirstActivity--->onResume

SecondActivity--->onStop

SecondActivity--->onDestroy

 

1、前端进程是拥有一个显示在屏幕最前端并与使用者做交互的Activity(它的onResume已被调用)的进程,也可能是一个拥有正在运行的IntentReceiver(它的onReceiveIntent()方法正在运行)的进程。

2、可视进程是拥有一个用户在屏幕上可见的,但并没有在前端显示的Activity(它的onPause已被调用)的进程。

3、服务进程是拥有一个由startService()方法启动的Service的进程。尽管这些进程对于使用者是不可见的,但他们做的通常是使用者所关注的事情(如后台MP3播放器或后台上传下载数据的网络服务)。

4、后台进程是拥有一个用户不可见的Activity(onStop()方法已经被调用)的进程。

5、空进程是那些不拥有任何活动的应用组件的进程。保留这些进程的唯一理由是,做为一个缓存,在它所属的应用的组件下一次需要时,缩短启动的时间。 

 

写过Android程序的都知道Activity中有一个名称叫onCreate的方法。该方法是在Activity创建时被系统调用,是一个Activity生命周期的开始。可是有一点容易被忽视,就是onCreate方法的参数saveInsanceState。因为在一般的程序开发中,很少用到这个参数。
onCreate方法的完整定义如下:
public void onCreate(Bundle saveInsanceState){
super.onCreate(saveInsanceState);
    从上面的代码可以看出,onCreate方法的参数是一个Bundle类型的参数。Bundle类型的数据与Map类型的数据相似,都是以key-value的形式存储数据的。
    从字面上看saveInsanceState,是保存实例状态的。实际上,saveInsanceState也就是保存Activity的状态的。那么,saveInsanceState中的状态数据是从何处而来的呢?下面我们介绍Activity的另一个方法saveInsanceState。
    onsaveInsanceState方法是用来保存Activity的状态的。当一个Activity在生命周期结束前,会调用该方法保存状态。这个方法有一个参数名称与onCreate方法参数名称相同。如下所示:
public void onSaveInsanceState(Bundle saveInsanceState){
super.onSaveInsanceState(saveInsanceState);
    在实际应用中,当一个Activity结束前,如果需要保存状态,就在onsaveInsanceState中,将状态数据以key-value的形式放入到saveInsanceState中。这样,当一个Activity被创建时,就能从onCreate的参数saveInsanceState中获得状态数据。
    状态这个参数在实现应用中有很大的用途,比如:一个游戏在退出前,保存一下当前游戏运行的状态,当下次开启时能接着上次的继续玩下去。再比如:电子书程序,当一本小说被阅读到第199页后退出了(不管是内存不足还是用户自动关闭程序),当下次打开时,读者可能已忘记了上次已阅读到第几页了,但是,读者想接着上次的读下去。如果采用saveInstallState参数,就很容易解决上述问题。

 public final void setDefaultKeyMode(int mode):
用来设置Activity的默认按键模式,也就是说当Activity中发生了一些按键事件,但是没有任何Listener来响应的时候就执行这里mode设置的动作

DEFAULT_KEYS_DISABLE = 0; //如果设为这个,则在activity中按键的不做响应

DEFAULT_KEYS_DIALER = 1; //如果设为这个,则在activity中按键会打开拨号器

DEFAULT_KEYS_SHORTCUT = 2; //将键盘输入作为当前窗体上注册的快捷键,进行快捷键处理 

DEFAULT_KEYS_SEARCH_LOCAL = 3; //将键盘输入作为搜索内容

DEFAULT_KEYS_SEARCH_GLOBAL = 4; //如果设为这个,则在activity中按键会打开全局搜索

 

 

 

      (1)、Active or Running——Activity位于栈顶

      (2)、Paused——这种状态下,Acitivty失去焦点,但仍然可见(可能是一个非全屏的Activity或者透明的Activity被置于这个Activity之上)。

      (3)、Stopped——这种状态下的Activity就得完全不可见。

      (4)、Inactive——当一个曾经被启动过的Activity被杀死时,它就变成inactive。Inactive Activity会从Activity栈中移除,当它重新显示和使用时需要再次启动。

       如果设备的配置(Configuration)改变了,系统会把当前 的Activity销毁(destroy),然后再创建它的一个新实例。

这篇文章里,我主要 是对Activity中一些有用的方法进行摘录,至于那些最常用 的比如说onCreate之类 的生命周期方法这里就略去不提了。

 

public Intent getIntent() ——获取启动这个Activity的Intent

 

public void setIntent(Intent newIntent) ——执行这个方法后,再调用getIntent()将返回newIntent

 

public final Application getApplication() ——获取此Activity所属的Application

 

public WindowManager getWindowManager() ——

   

public Window getWindow()          

 

public View getCurrentFocus() ——当前取得焦点的View

 

protected void onNewIntent(Intent intent)——如果该Acitivity的launchMode设置成了singleTop或者其他的组件通过intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)这样的intent来启动该Activity的时候,如果此Activity的实例已经存在了,那么不会再创建新的实例,而是把已经存在的该Activity的实例放到activity stack的栈顶。。此时这个方法会被调用(在onResume之前调用)。在这个方法的重写版本中,我们应该调用setIntent()方法来更新以使通过getIntent()获取到的是最新的启动这个Activity的Intent。

protected void onSaveInstanceState(Bundle outState) ——如果这个Activity不是在running状态,某个时刻可能因为内存原因系统会将其回收掉,再将来某个时刻再回到这个Activity的时候系统会尝试重新创建一个新实例。我们可能希望这个Activity在被 回收前我们可以做一些当前用户界面的保存或其他状态的保存,这时我们就应该重写这个方法,因为这个方法会在onStop之前被调用,我们可以通过其参数outState来保存状态,在onCreate(onSavedInstanceState)方法中从onSavedInstanceState中获取我们之前保存的状态值来恢复这个Activity被kill之前 的状态。

 

protected void onUserLeaveHint()——当一个Activity将要进入后台(background)时被回调。

 

public void onConfigurationChanged(Configuration newConfig)——请查看API文档

 

public void onLowMemory() ——当整个系统运行一个低内存状态时,这个方法会被调用 。我们可以重写这个方法来清除一些缓存或者其它的不必要的资源。当这个方法返回的时候 ,系统会进行一次垃圾回收

 

 

public final Cursor managedQuery(Uri uri,

                                     String[] projection,

                                     String selection,

                                     String[] selectionArgs,

                                     String sortOrder)

    {

        Cursor c = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);

        if (c != null) {

            startManagingCursor(c);

        }

        return c;

}——从这个方法的实现中我们可以看出它除了获取一个ContentResolver实例来实现查询外,该Activity还会根据它的生命周期对返回的Cursor对象的生命周期进行管理。举个例子说,当此Activity重新启动的时候,会调用Cursor对象的requery方法以相同的参数来重新进行查询。

 

 

public void onBackPressed() {

        finish();

}——按back键时会被调用 ,默认情况下是结束当前Activity的生命,但是我们可以重写这个方法来实现我们想要的操作。

 

public boolean onTouchEvent(MotionEvent event) {

        return false;

}——用来处理屏幕触摸事件,如果被触摸到的View没有处理这个事件的话,这个方法会被调用(当然了它必须得返回true了)。提到这个方法,我们有必要再说下这个方法:

public boolean onTouch(View v, MotionEvent event),这个方法是定义在View.OnTouchListener这个接口中的,一般我们可以通过view.setOnTouchListener()来设定这个此监听器。我们可以看到这个方法的参数表中还有一个View类型的参数,这个是用来获取触摸事件的发生源的。还有,如果一个触摸事件发生在了同一个View上,而这个View设置了OnTouchListener,那么 只有onTouch()方法返回false的时候 onTouchEvent()才会被调用。

      

public boolean onTrackballEvent(MotionEvent event) {

        return false;

    }

 

public void addContentView(View view, ViewGroup.LayoutParams params)——看名字,原来通过serContentView(View)设置的view不会被移除。

 

public void onContentChanged() ——当调用setContnetView或addContentView时这个方法会被调用。

 

 

public boolean onCreateOptionsMenu(Menu menu) ——我们会重写这个方法来创建选项菜单,这个方法只会被系统调用一次(菜单第一次显示时)。

 

public boolean onPrepareOptionsMenu(Menu menu)+——每次菜单显示前都会调用这个方法,因此如果我们想在菜单显示前根据某些条件更新菜单内容,可以重写这个方法。

 

 public void onOptionsMenuClosed(Menu menu) ——看名字哈。。

 

public void openOptionsMenu()

public void closeOptionsMenu() 通过程序的方法打开/关闭菜单

 

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)——创建上下文菜单,每次上下文菜单将要显示的时候都会调用这个方法。

 

public void registerForContextMenu(View view) ——为某个View注册上下文菜单。

 

public void unregisterForContextMenu(View view) ——阻止在view上显示上下文菜单

 

public void openContextMenu(View view)

public void closeContextMenu()             通过程序调用的方式来打开或者关闭上下文菜单

 

public boolean onSearchRequested() {

        startSearch(null, false, null,false);

        return true;

}——响应搜索请求信号

 

public void startSearch(String initialQuery, boolean selectInitialQuery,

            Bundle appSearchData, boolean globalSearch) ——用来启动搜索的UI界面,经常在onSearchRequest()方法中调用

 

public void takeKeyEvents(boolean get)——即使在Activity中没有取得 焦点的View,也会处理此按键事件。

 

public final boolean requestWindowFeature(int featureId) {

        return getWindow().requestFeature(featureId);

    }——常用的featureId有:FEATURE_NO_TITLE,FEATURE_PROGRESS,FEATURE_LEFT_ICON,

FEATURE_INDETERMINATE_PROGRESS,这些静态常量都定义在Window类中

 

public final void setFeatureDrawableResource(int featureId,int resId)————featureId定义在Window类中,resId是我们放在res目录下的图片资源ID。这个方法必须在requestWindowFeature调用之后才能使用。 。

public final void setFeatureDrawableUri(int featureId, Uri uri)——同上

 

public LayoutInflater getLayoutInflater()

public MenuInflater getMenuInflater()——这两个方法也很有用,我们可以通过它们获取Inflater然后来解析布局文件来返回View或产生menu

 

public void startActivityForResult(Intent intent, int requestCode)——对于这个方法有几点 要注意:如果requestCode的值小于0,这个方法的作用就和startActivity一样了,也就是说不会返回值。如果你要启动的Activity和此Activity不在一个task中,那么会马上收到一个RESULT_CANCELED的responseCode。

 

public void startActivity(Intent intent) {

        startActivityForResult(intent, -1);

}——最常用的方法之一及其实现 。。

 

public boolean startNextMatchingActivity(Intent intent)——这个方法一般这样用。。onCreate(){
...

boolean has =startNextMatchingActivity(getIntent());

if(has){

finish();

}

...

}

 

public String getCallingPackage()

public ComponentName getCallingActivity()

 

public void finishActivity(int requestCode)——关闭之前通过 startActivityForResul(intent,requestCode)调用的Activity(们)。。

 

public void setRequestedOrientation(int requestedOrientation)——改就能当前Activity的屏幕朝向,requestedOrientation是定义在ActivityInfo中的静态常量。

 

public int getTaskId() ——此Activity所在的Task的ID。这里给出Task的官方定义 :A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the "back stack"), in the order in which each activity is opened.

 

public boolean isTaskRoot() ——如果此Activity是所在Task中的第一个Activity返回true.

 

public boolean moveTaskToBack(boolean nonRoot)——把这个Activity所在的Task移到后台(background,此时将回到Home或者之前的Task)。nonRoot为false时,只有isTaskRoot()返回true时这个方法才会起作用。

 

public String getLocalClassName()——获得这个类的名字,不带限定名

public ComponentName getComponentName()

 

public SharedPreferences getPreferences(int mode)——获得的SharedPerference只属于这个Activity。

 

public void setTitle(CharSequence title)

public void setTitle(int titleId)

public void setTitleColor(int textColor)——对标题栏的一些设置,也有对应的getter方法

 

public final void setProgressBarVisibility(boolean visible)——设置标题栏中ProgressBar的可见性。

public final void setProgressBarIndeterminateVisibility(boolean visible)

public final void setProgressBarIndeterminate(boolean indeterminate)——设置为进度不确定的.

public final void setProgress(int progress)——progress的取值范围为0~10000

public final void setSecondaryProgress(int secondaryProgress)

 

public final void setVolumeControlStream(int streamType)——streamType可取值是定义在AudioManager静态常量,例如STREAM_MUSIC, STREAM_NOTIFICATION, STREAM_VOICE_CALL等。这个方法就是用来设置声音控制按钮控制的声音的类型的。这个方法有相应的getter。

public final void runOnUiThread(Runnable action)——action这个任务将在UI线程中运行。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值