如何从Preference释放资源,相当于onDestroy()可用?

时间:2014-04-09 21:34:38

标签: android admob

Android为其活动定义了一个很好的生命周期:它以onCreate()开头,并以调用onDestroy()结束其破坏。我正在尝试为Preference中管理的自定义PreferenceFragment对象找到类似的东西,即:我希望能够破坏我在Preference的onCreateView()中创建的资源。偏好是生命的终结。是否有一种正确的方法来执行此操作,而无需在自定义首选项中定义公共destroy()函数,然后从PreferenceFragment的onDestroy()函数调用它?

例如:

  • PreferenceFragment的onDestroy()函数:

    @Override
    public void onDestroy() {
        super.onDestroy();
    
        AdMobPreference admobPref1 = (AdMobPreference) this.findPreference("admob1");
        admobPref1.destroy();
        AdMobPreference admobPref2 = (AdMobPreference) this.findPreference("admob2");
        admobPref2.destroy();
    
        Log.d(TAG, "onDestroy() called!");
    }
    
  • AdMobPreference的destroy()函数(自定义首选项)

    public void destroy() {
        if(mAdView != null) {
            mAdView.destroy();
            mAdView = null;
        }
    }
    

这很快就表明定义自定义首选项的xml之间存在一些高度耦合(因为我们需要定义显式键,在这种情况下需要定义admob1和admob2)和PreferenceFragment的源代码(特定的destroy()指令需要要添加到onDestroy()函数,例如:admobPref1.destroy();在这种情况下)。 我会假设谷歌会预料到这种情况,并且偏好可能需要一个适当的可重写的onDestroy()来清理资源?我错过了什么吗?

3 个答案:

答案 0 :(得分:1)

我怀疑偏好设计的设计紧密围绕着。偏好。

他们当然不希望您尝试在偏好设置屏幕上投放广告。

我可以注意到:

  1. 您不太可能从pref屏幕上显示的广告获得任何重要的广告流量。
  2. 您在屏幕上显示多个横幅广告是违反Admob政策的。

答案 1 :(得分:0)

我认为正确的解决方案是使用Fragment。 Fragment有自己的生命周期,因此可以正确管理资源。

使用片段显示AdMob横幅的附加值,可以将设置屏幕分为2:顶部的AdMob片段和下面的PreferenceFragment。 另一个积极的观点:AdMob合规性的问题已经通过这种方式得到解决:屏幕上只有1个横幅。

答案 2 :(得分:-1)

没有onDestory()或任何其他生命周期方法。所以你必须建立自己的。这是我的代码:

关于自定义偏好:

public class SetTimeoutPreference extends Preference {
...

public void bind(Context context){
...
}

public void unbind(Context context){
...
}
}

活动:

private SetTimeoutPreference mTimeoutPreference;

@Override
protected void onResume() {
    super.onResume();
    mTimeoutPreference = mPrefsFragment.getPreference(PREF_SET_TIMEOUT);
    mTimeoutPreference.onBind(this);
}

@Override
protected void onPause() {
    super.onPause(); 
    mTimeoutPreference.onUnbind();
}
PreferenceFragment上的

getPreference()是:

public static class PrefFragment extends PreferenceFragment {
    public <T extends Preference> T getPreference(CharSequence key) {
        return (T) getPreferenceScreen().findPreference(key);
    }
}

请注意,可能会在活动onCreateView()之后调用偏好的onResume(),因此初始化变量并不安全。