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()来清理资源?我错过了什么吗?
答案 0 :(得分:1)
我怀疑偏好设计的设计紧密围绕着。偏好。
他们当然不希望您尝试在偏好设置屏幕上投放广告。
我可以注意到:
答案 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()
,因此初始化变量并不安全。