我已经玩了几个星期的MVP模式,我已经到了需要上下文来启动service和访问的地步Shared Preferences.
我已经读过MVP的目的是将视图与逻辑分离,并且context在一个内部Presenter可以打败那个目的(如果我错了,请纠正我).
目前,我有一个看起来像这样的LoginActivity:
LoginActivity.java
public class LoginActivity extends Activity implements ILoginView {
private final String LOG_TAG = "LOGIN_ACTIVITY";
@Inject
ILoginPresenter mPresenter;
@Bind(R.id.edit_login_password)
EditText editLoginPassword;
@Bind(R.id.edit_login_username)
EditText editLoginUsername;
@Bind(R.id.progress)
ProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
MyApplication.getObjectGraphPresenters().inject(this);
mPresenter.setLoginView(this, getApplicationContext());
}
@Override
public void onStart() {
mPresenter.onStart();
ButterKnife.bind(this);
super.onStart();
}
@Override
public void onResume() {
mPresenter.onResume();
super.onResume();
}
@Override
public void onPause() {
mPresenter.onPause();
super.onPause();
}
@Override
public void onStop() …Run Code Online (Sandbox Code Playgroud) 既然我们可以从远程Shell中检查sqlite3数据库,是否可以检查adb shell中的SharedPreferences?因为在调试时从命令行检查和操作SharedPreferences会更方便.
或者以另一种方式,在什么文件中保存SharedPreferences,以及如何查看和修改这些文件?
我已经实现了我自己的PreferenceFragment子类(在此详述),并希望在其中监听偏好更改.PreferenceFragment为您提供了两种执行此操作的方法:
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
Run Code Online (Sandbox Code Playgroud)
和
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
Run Code Online (Sandbox Code Playgroud)
应该使用哪一个?有什么不同?我真的不明白Android文档中的区别.
例外情况仅发生在Android 7.0 Nougat(模拟器)设备中.
java.lang.SecurityException:不再支持MODE_WORLD_READABLE
我的代码:
public void SessionMaintainence(Context context) {
this.context = context;
preferences = context.getSharedPreferences(PREF_NAME, Context.MODE_WORLD_READABLE);
editor = preferences.edit();
editor.commit();
}
Run Code Online (Sandbox Code Playgroud)
logcat的:
> E/AndroidRuntime: FATAL EXCEPTION: main
> Process: burpp.av.feedback, PID: 2796
> java.lang.RuntimeException: Unable to create application
> burpp.av.feedback.FeedbackApplication: java.lang.SecurityException:
> MODE_WORLD_READABLE no longer supported
> at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5364)
> at android.app.ActivityThread.-wrap2(ActivityThread.java)
> at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528)
> at android.os.Handler.dispatchMessage(Handler.java:102)
> at android.os.Looper.loop(Looper.java:154)
> at android.app.ActivityThread.main(ActivityThread.java:6077)
> at java.lang.reflect.Method.invoke(Native Method)
> at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
> at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
> Caused by: java.lang.SecurityException: MODE_WORLD_READABLE …Run Code Online (Sandbox Code Playgroud) android android-securityexception android-sharedpreferences android-7.0-nougat
我有一个SettingsActivity扩展PreferenceActivity到我的应用程序中显示设置.
有一个后退箭头,但它不起作用.
这是SettingsActivity.java文件的代码:
public class SettingsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener{
private AppCompatDelegate mDelegate;
public static final String RESET_PASSWORD_KEY = "reset_password";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
getDelegate().installViewFactory();
getDelegate().onCreate(savedInstanceState);
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
SharedPreferences sharedPreferencesCompat = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
Preference myPref = (Preference) findPreference(RESET_PASSWORD_KEY);
myPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
//open browser or intent here
Intent resetPasswordActivityIntent = new Intent(SettingsActivity.this, ResetPasswordActivity.class);
startActivity(resetPasswordActivityIntent);
return true;
}
});
}
@Override
protected void onPostCreate(Bundle savedInstanceState) …Run Code Online (Sandbox Code Playgroud) android preferenceactivity android-preferences android-sharedpreferences
当我得到偏好时,有什么区别:
PreferenceManager.getDefaultSharedPreferences(getBaseContext());
Run Code Online (Sandbox Code Playgroud)
和
getPreferences(Context.MODE_PRIVATE);
Run Code Online (Sandbox Code Playgroud) 我目前正在开发"开发Android应用程序"Udacity课程.在"第3课:新活动和意图>使用SharedPreferences"部分中,教师要求我在Android开发者网站上挖掘如何获取用户首选项SharedPreferences.但是,我发现官方文档和课程解决方案之间存在差异.
Udacity课程的解决方案说,为了抓住一个SharedPreferences实例PreferenceActivity,你应该打电话:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
Run Code Online (Sandbox Code Playgroud)
(这里getActivity()只是在Context这里,因为它在里面被称为Fragment.)
虽然Android开发者网站上的官方文档表明您应该致电:
SharedPreferences prefs = getActivity().getPreferences(Context.MODE_PRIVATE)
Run Code Online (Sandbox Code Playgroud)
那么PreferenceManager.getDefaultSharedPreferences(Context context)和之间的区别是Activity.getPreferences(int mode)什么?
请注意:此问题不涉及getSharedPreferences()需要文件名的任何内容.这是关于之间的差异getPreferences()和getDefaultSharedPreferences().
提前致谢.
我读过这篇文章https://medium.com/@ianhlake/hidden-gems-of-android-o-7def63136629.这就是那里写的:
SharedPreferences已经死了.累积的SharedPreferences.
将SharedPreferences继续在Android O中工作吗?我们是否需要实现自己的机制,通过实现将数据存储在键值对中PreferenceDataStore
任何人都可以帮助实现新的SharedPreferences使用方法 PreferenceDataStore和开发自己实现的用例是什么?目前的方法有任何缺点吗?
我有一个设置屏幕,在其中设置一些值。设置这些值时,它将保存在共享首选项中,并且在我对网络api调用的请求中需要这些值作为参数。
现在,我可以在活动中使用侦听器共享首选项,然后进行api调用并获取新数据,但是我想将其与LiveData一起使用。
如何使用LiveData侦听共享首选项中的更改,然后使用新参数进行网络呼叫。
我正在学习cookies在Android中存储并遇到了几种实现它的方法.其中一个是使用CookieManager and CookieStore.
当我浏览Android文档时,我发现了以下声明:
为了在客户端和服务器之间建立和维护可能长期存在的会话,HttpURLConnection包括一个可扩展的cookie管理器.使用CookieHandler和CookieManager启用VM范围的cookie管理:
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
Run Code Online (Sandbox Code Playgroud)
我不明白的意思VM-wide cookie management.我知道VM意味着Virtual Machine.
我的解释:
我解释它的一种方法是,创建CookieManager并传递它以setDefault()使其在整个应用程序中可用.因此,我尝试了以下测试.
URL url = new URL("http://something.com");
URI uri=new URI("http://something.com");
urlConnection = (HttpURLConnection) url.openConnection();
cks=urlConnection.getHeaderField("Set-Cookie");
//cks is a String
cookieManager=new CookieManager();
CookieHandler.setDefault(cookieManager);
HttpCookie hc=new HttpCookie("Cookie1",cks);
cookieManager.getCookieStore().add(uri,hc);
cks1=cookieManager.getCookieStore().getCookies().get(0).getValue();
//cks1 is another String
Run Code Online (Sandbox Code Playgroud)
我设置cks and cks1为TextViews并按content/value预期打印cookie .根据我的解释,我尝试cookieManager.getCookieStore().getCookies().get(0).getValue();了另一个活动,但它没有识别出对象,这意味着它超出了范围而且无法访问.此外,创建了一个新的,CookieManager并尝试获取cookie,但它返回null.因此,我假设可以跨活动访问VM范围的这种解释是不正确的.
第二个解释是Cookies将在CookieManager设置时自动存储.我从SO的另一个问题的解决方案中得到了它:使用Java URLConnection进行Cookie管理
解决方案中的一个陈述如下: …
cookies android httpurlconnection android-cookiemanager android-sharedpreferences