Activity中recreate方法的应用

参考两篇文章:http://blog.csdn.net/watermusicyes/article/details/47392949

http://blog.csdn.net/droyon/article/details/21275797

recreate可以使用在日间/夜间模式的切换,那么调用recreate()函数将会执行哪些方法呢?

代码:

public class MainActivity extends FragmentActivity implements OnClickListener {
	private Button btn;
	private int mTheme;
	private String THEME = "theme";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		if (savedInstanceState != null) {
			mTheme = savedInstanceState.getInt(THEME);
			switchTheme(mTheme);
		}

		setContentView(R.layout.activity_main);
		btn = (Button) findViewById(R.id.btn);
		btn.setOnClickListener(this);

		Log.e(MainActivity.class.getName(), "onCreate");
	}

	@Override
    protected void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        Log.e(MainActivity.class.getName(), "onSaveInstanceState");
        savedInstanceState.putInt(THEME, mTheme);
    } 

	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
		Log.e(MainActivity.class.getName(), "onRestoreInstanceState");
	}

	@Override
	protected void onStart() {
		super.onStart();
		Log.e(MainActivity.class.getName(), "onStart");

	}

	@Override
	protected void onResume() {
		super.onResume();
		Log.e(MainActivity.class.getName(), "onResume");

	}

	private void switchTheme(int theme) {
		switch (mTheme) {
		case android.R.style.Theme_Holo_Light:
			mTheme = android.R.style.Theme_Black_NoTitleBar;
			break;
		case android.R.style.Theme_Black_NoTitleBar:
			mTheme = android.R.style.Theme_Holo_Light;
			break;
		default:
			mTheme = android.R.style.Theme_Holo_Light;
			break;
		}
		setTheme(mTheme);
	}

	@SuppressLint("NewApi")
	@Override
	public void onClick(View v) {
		recreate();
	}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.testandroid.MainActivity" >

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="recreate" />

</RelativeLayout>

点击recreate按钮可以看到打印相关的信息:

可以看到这里调用recreate方法会比正常启动Activity多调用了onSaveInstanceState和onRestoreInstanceState,并且onSaveInstanceState在onCreate方法之前调用。

注意:(1)

if (savedInstanceState != null) {
			mTheme = savedInstanceState.getInt(THEME);
			switchTheme(mTheme);
		}

这部分代码要在setContentView(R.layout.activity_main)代码之前调用,否则改变不了主题。

(2)recreate()方法是在Android3.0引入的,所以如果在3.0之前使用会出现错误,如下图所示:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-01 20:17:54

Activity中recreate方法的应用的相关文章

在Activity中onCreate方法里面获取空间宽度和高度的新姿势

以前获取一个View的宽度和高度,总是在Activity中的onCreate方法中获取不到,那么我们怎么在onCreate方法中获取到控件的宽度和高度呢? 方法:用View中的post方法- 代码如下: public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setConten

理解Activity中的方法回调

理解Android中Activity的方法回调 这篇文章主要介绍了理解Android中Activity的方法回调,本文用一个完整实例模拟了Activity方法回调的过程,从而加深理解Activity的方法回调思想,需要的朋友可以参考下 为什么需要方法回调? 方法回调是功能定义和功能分离的一种手段,是一种松耦合的设计思想.在JAVA中回调是通过接口来实现的.作为一种系统架构,必须要有自己的运行环境,并且要提供用户的实现接口. 下面通过实例来模拟一下Android中Activity的方法回调思想.A

怎样在一个fragment or 随意类中操作还有一个fragment中的方法

1 怎样在acitivty中运行fragment中的方法: 首先获得这个Fragment的对象 xxxFragment fragmentObject = (xxxFragment) getFragmentManager.findFragmentByTag("xx"); 2 怎样在Fragment中运行activity中的方法: 第一种:让acitivity继承接口 另外一种:在fragment中使用getActivity()可是要加上acitivity的名字,即: ((MainActi

Activity中Menu相关的几个方法的调用时机

用于创建菜单的常用的方法有如下两种: 1.onCreateOptionsMenu(Menu menu) 2.onPrepareOptionsMenu(Menu menu) MyDiaryActivity中的方法: 1 /** 2 * Initialize the contents of the Activity's standard options menu. 3 * You should place your menu items in to menu. 4 */ 5 public boole

android中按back键返回上一个activity,如何重新调用上一个activity的oncreate方法?

默认情况下是不会调用的. @Override public void onBackPressed() { String titleStr = edittitle.getText().toString(); String contentStr = editcontent.getText().toString(); if (title.equals(titleStr) && content.equals(contentStr)) { super.onBackPressed(); } else

在Activity的onCreate方法中显示PopupWindow导致异常的原因分析及解决方案

一.前言 在某些情况下,我们需要一进入Activity就显示PopupWindow,比如常见的选择界面.但由于PopupWindow是依附于Activity的,如果Activity没有创建完成,Activity还没完全显示出来就显示PopupWindow的话,会出现异常现象. 二.问题复现 我在Activity的onCreate()方法中调用如下方法: public void show( ){ if( null != mPopupWindow ){ mPopupWindow.showAtLoca

在Fragment中OnActivityResult方法中接收Activity中返回的值

在Fragment中OnActivityResult方法中接收Activity中返回的值 在Fragment中OnActivityResult方法中接收Activity中返回的值,有需要的朋友可以参考下. 在开发android中,有些人往往很疑惑,当一个FragmentActivity中有多个碎片的时候,如a,b,c三个碎片, 其中b中进行了操作,跳转到了新的界面D(activity).但是当D操作完后,返回值到碎片b.那么问题就来了,肯定会有人问,b是一个碎片,如何才能接收到D传过来的值呢?

ListView使用自定义适配器的情况下实现适配器的控件点击事件执行Activity界面中的方法

如果ListView使用的是自定义的适配器,比如MyArrayAdapter extends ArrayAdapter<String> 那么,如何实现适配器中的点击事件执行activity界面中的方法呢? 实现思路:在自定义适配器MyArrayAdapter 类型中自定义接口和接口方法,然后在activity界面中MyArrayAdapter实例实现这个接口. 较为完整的代码见上文. 1.MyArrayAdapter 关键代码 自定义接口和方法的代码如下: //列表项的单击事件监听接口 pub

判断一个Activity 判断一个包 是否存在于系统中 的方法

判断一个包是否存在于系统中(来自网络),经过测试,好用: public boolean checkBrowser(String packageName) { if (packageName == null || "".equals(packageName)) return false; try { ApplicationInfo info = getPackageManager().getApplicationInfo( packageName, PackageManager.GET_