标签: ondestroy

Android活动生命周期 - 这些方法有哪些?

Android活动的生命周期是什么?为什么这么多的发音相似的方法(onCreate(),onStart(),onResume()初始化过程调用),和许多其他人(onPause(),onStop(),onDestroy())呼吁在结束了吗?

这些方法何时被调用,它们应该如何正确使用?

lifecycle android onresume oncreate ondestroy

406
推荐指数
7
解决办法
28万
查看次数

Activity.finish()方法到底在做什么?

我正在开发Android应用程序一段时间,并且关注了很多关于活动生命周期和应用程序生命周期的帖子.

我知道Activity.finish()方法调用的方法Activity.onDestroy(),并从堆栈中删除活动,我想它以某种方式指向操作系统和垃圾收集器,他可以"做他的把戏"并释放内存,当它发现它是一个很好的时间做所以....

我来到这篇文章 - 退出申请不赞成?并阅读Mark Murphy的回答.

这让我对这个finish()方法究竟是做什么感到困惑.

我有机会打电话finish(),onDestroy()不会打电话吗?

android application-lifecycle activity-lifecycle ondestroy

148
推荐指数
7
解决办法
20万
查看次数

Activity的onDestroy/Fragment的onDestroyView设置了Null实践

我正在阅读ListFragment源代码,我看到了这个实现:

ListAdapter mAdapter;
ListView mList;
View mEmptyView;
TextView mStandardEmptyView;
View mProgressContainer;
View mListContainer;
CharSequence mEmptyText;
boolean mListShown;

/**
 * Detach from list view.
 */
@Override
public void onDestroyView() {
    mHandler.removeCallbacks(mRequestFocus);
    mList = null;
    mListShown = false;
    mEmptyView = mProgressContainer = mListContainer = null;
    mStandardEmptyView = null;
    super.onDestroyView();
}
Run Code Online (Sandbox Code Playgroud)

在此函数中,Google开发人员将Null设置为在ListFragment中声明的所有视图字段,并删除回调"mRequestFocus".

ListActivity源代码中.Google开发人员实施如下:

protected ListAdapter mAdapter;
protected ListView mList;

private Handler mHandler = new Handler();


@Override
protected void onDestroy() {
    mHandler.removeCallbacks(mRequestFocus);
    super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)

我没有看到Google开发人员在ListActivity的onDestroy上将Null设置为mList,就像他们为ListFragment类所做的那样.

我的问题是

  1. 为什么谷歌开发者没有在ListActivity的onDestroy中将Null设置为mList?有什么原因?

  2. 我们是否需要将Null设置为Activity的onDestroy和Fragment的onDestroyView中的所有View字段?

3.在这两个函数中设置Null的任何做法:Activity的onDestroy和Fragment的onDestroyView?

谢谢你的想法!

android ondestroy android-fragments android-activity

34
推荐指数
1
解决办法
2万
查看次数

onDestroy()究竟是什么破坏了?

我一直被这个"特性"所困扰:当我使用Back按钮离开我的应用程序时,我可以告诉onDestroy()被调用,但是下次我运行我的应用程序时,Activity类的所有静态成员仍然保留它们的值.请参阅以下代码:

public class HelloAndroid extends Activity {

private static int mValue;   // a static member here

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView tv = new TextView(this);
    tv.setText((mValue != 0) ? 
        ("Left-over value = " + mValue) : "This is a new instance");
    setContentView(tv);
}

public void onDestroy() {
    super.onDestroy();
    mValue++;
}
Run Code Online (Sandbox Code Playgroud)

}

上面的代码在mValue中显示剩余值,并在会话结束时递增,这样我就可以确定调用了onDestroy().

我在这个论坛上找到了一个有用的答案,我在上面的代码中理解mValue是一个类成员,而不是实例成员.但是,在这个特殊情况下,我只有一个HelloAndroid活动,所以当他去世时,一切都被清理干净,下次我回来时,一切都重新开始了,这不是真的吗?(或者,在onDestroy()之后,系统中还有其他一些神秘的东西仍然坚持它,这样它就不会死了吗?)

(上面只是一个变量,如果它是一堆对象引用怎么办?每个部分都是一个单独的可重新收集的内存.GC是否有机会收集其中一些而不是全部或者没有?这真的让我烦恼. )

android ondestroy

29
推荐指数
2
解决办法
3万
查看次数

Android在方向更改时保存状态

我有一个Android应用程序,它维护有关行进距离,时间流逝等的状态.当用户更改屏幕时Android调用onDestroy()时,我可以方便地存储在对象中并在Bundle中存储对该对象的引用方向,然后恢复onCreate(Bundle savedBundle)中的状态.但是,我在屏幕上的Buttons和EditText对象中也有一些状态,我希望通过屏幕方向保持这种状态.例如,在onStart(Bundle savedBundle)中我调用:

_timerButton.setBackgroundColor(Color.GREEN);
_pauseButton.setBackgroundColor(Color.YELLOW);
_pauseButton.setEnabled(false);
Run Code Online (Sandbox Code Playgroud)

然后在我的应用程序的整个操作过程中,这些按钮的颜色/启用状态将被更改.是否有更方便的方法来持久保存用户界面项(EditText,Button对象等)的状态,而无需手动保存/恢复每个按钮的每个属性?在屏幕方向之间手动管理这种类型的状态感觉非常笨拙.

谢谢你的帮助.

android state ondestroy android-bundle

28
推荐指数
2
解决办法
3万
查看次数

Activity OnDestroy从未调用过?

我在ListActivity中使用以下代码

// a separate class in project
public class MyActivity extends ListActivity {
    // some common functions here..
}

public class SelectLocation extends MyListActivity {

    public void onCreate(Bundle savedInstance) {
        // here.....
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (adap != null) adap = null;
        if (list != null) list = null;
        System.gc();
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都指导我为什么onDestroy在我的代码中没有调用方法?

android ondestroy

27
推荐指数
3
解决办法
7万
查看次数

每次屏幕亮起时都会调用onDestroy

每次从屏幕关闭状态返回时,我的应用程序都会被杀死.我获取了我的应用程序所做的所有信息,但我无法找到它调用onDestroy的原因.这是我第一次在我的应用程序中看到这种行为.

我的主要活动扩展了tabActivity,因为它包含tabhost.我已经读过它必须扩展它或它将FC.我不确定我的问题是否与此有关?!哦,它实现了Observer,但这应该没问题.

这是日志:

07-21 09:57:53.247: VERBOSE/###(13180): onResume
07-21 09:57:53.267: VERBOSE/###(13180): onPause
07-21 09:57:59.967: VERBOSE/###(13180): onResume
07-21 09:58:00.597: VERBOSE/###(13180): onPause
07-21 09:58:00.597: VERBOSE/###(13180): onDestroy
07-21 09:58:00.637: VERBOSE/###(13180): onCreate
Run Code Online (Sandbox Code Playgroud)

疯狂的是,它在屏幕再次亮起后最多调用onDestroy,有时它有足够的时间在屏幕关闭之前执行此操作.但是在它再次发生之后它再次发生了同样的事情......

我希望有人给我一个提示或有关如何解决此问题的任何信息.

我不确定这是否重要,但我使用android 2.1-update1 sdk作为我的应用程序.


编辑:

该应用程序在真正的Android设备上进行测试.

这是一些基本代码,删除了所有不必要的行和信息:

package;
imports;

public class WebLabActivity extends TabActivity implements Observer{

#declerations

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.v("###", "onCreate");
    setContentView(R.layout.main);
    # initialize some basic things
}

@Override
public void onResume() {
    super.onResume();
    Log.v("###", "onResume");
}

@Override …
Run Code Online (Sandbox Code Playgroud)

android screen onresume ondestroy onpause

24
推荐指数
2
解决办法
2万
查看次数

在Activity被杀死并重新创建后,片段仍然存在

我有一个FragmentActivity(支持片段),我通过代码创建片段并将它们放入FrameLayouts.到目前为止一切正常.现在,如果我离开应用程序返回一切正常,只要系统不会杀死我的活动(或者我使用DDMS中的停止按钮执行此操作).如果发生这种情况,则不会调用任何内容,我的Activity也会被杀死.没有调用onDestroy.

因此,当我重新打开我的应用程序时,所有碎片仍然存在,并且我得到NullPointerExeptions因为他们试图完成他们的工作.片段不应该存在于App的这种状态中,这对我来说是个问题.

我不需要它们在backStack中,所以我不把它们放在那里,不能调用popBackStack()来摆脱它们.

如何在onCreate()中重置FragmentManager,或者只是确保片段也被销毁?

android kill-process ondestroy android-fragments android-fragmentactivity

24
推荐指数
2
解决办法
1万
查看次数

Android Activity onDestroy()并不总是被调用,如果被调用,则只执行部分代码

并不总是调用onDestroy().如果被调用,则只执行部分代码.
而且大部分时间在LogCat中我只看到消息"首先调用destroy的gps状态".这是为什么?

protected void onDestroy() {
    super.onDestroy();
    Log.d("on destroy called", "gps state on destroy called first");

    editor.putBoolean("gpsOn", false);
    Log.d("on destroy called", "gps state on destroy called second");
    editor.commit();

    Log.d("on destroy called", "gps state on destroy called third");
    stopRouteTracking();
    Log.d("on destroy called", "gps state on destroy called  fourth");
}
Run Code Online (Sandbox Code Playgroud)

android ondestroy

24
推荐指数
2
解决办法
6万
查看次数

如何恢复通知而不重新创建活动?

我想我已经想到了这个问题,但在对这个问题进行一些调试之后:如何使通知无法删除/不可删除我刚刚意识到我的活动仍以随机顺序进入onCreated()和onDestroyed().

我的活动清单:

<activity
        android:name="***.***.***.*****"
        android:configChanges="orientation|keyboardHidden"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:launchMode="singleTop" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
Run Code Online (Sandbox Code Playgroud)

我也尝试过launchmodes singleTask,singleInstance.

我的通知意图代码:

Intent intent = new Intent(context, MyClass.class);
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    //intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
    //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    //intent.setFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
    //intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我已经尝试过看起来可能相关的每一面旗帜,但没有运气......

这会产生一些不需要的伪像,例如每次单击通知时重新启动AlarmManager并触发alarmmanager start-task.我想避免这种情况.

有什么建议?

编辑:我知道有很多像这样的问题,但提供的解决方案似乎没有在这里做到这一点......:/

Edit2:根据要求,这是我的班级:

package ***.***.***;

import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Bundle;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.PorterDuff;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import android.util.Log; …
Run Code Online (Sandbox Code Playgroud)

notifications android oncreate ondestroy

23
推荐指数
3
解决办法
2万
查看次数