我正在创建一个项目,我有一个登录屏幕,用于登录用户
应用。 此登录屏幕应该只在第一次可见,因此用户可以填写并登录,但是当用户第二次打开应用程序时,应用程序必须显示main.activity。 如何使用共享首选项。
我不明白该怎么做。
您尝试与我们分享的链接格式不正确。 请编辑您的问题以添加正确的链接。
要使用SharedPreferences实现此目的,您可能会执行以下操作:
在您认为更合适的任何类中插入以下内容。我们假设你在类Example中插入它。
//Give your SharedPreferences file a name and save it to a static variable
public static final String PREFS_NAME ="MyPrefsFile";
现在,在评估用户是否成功登录的方法中,执行以下操作。注意Example类,您必须更改它以匹配您的代码。
//User has successfully logged in, save this information
// We need an Editor object to make preference changes.
SharedPreferences settings = getSharedPreferences(Example.PREFS_NAME, 0); // 0 - for private mode
SharedPreferences.Editor editor = settings.edit();
//Set"hasLoggedIn" to true
editor.putBoolean("hasLoggedIn", true);
// Commit the edits!
editor.commit();
最后,当您的应用程序启动时,您现在可以评估用户是否已登录。仍然需要注意必须更改的Example类。
SharedPreferences settings = getSharedPreferences(Example.PREFS_NAME, 0);
//Get"hasLoggedIn" value. If the value doesn't exist yet false is returned
boolean hasLoggedIn = settings.getBoolean("hasLoggedIn", false);
if(hasLoggedIn)
{
//Go directly to main activity.
}
希望这可以帮助
编辑:为防止用户使用后退按钮返回登录活动,您必须在开始新活动后finish()该活动。
以下代码取自Forwarding.java | Android开发者
// Here we start the next activity, and then call finish()
// so that our own will stop running and be removed from the
// history stack
Intent intent = new Intent();
intent.setClass(Example.this, ForwardTarget.class);
startActivity(intent);
Example.this.finish();
因此,您需要在代码中执行的操作是在调用startActivity()之后调用Login活动上的finish()函数。
另请参阅:从历史堆栈中删除活动
它显示错误(Example.PREFS_NAME,0);我需要在哪些活动中添加此代码?
@sandiparmal请仔细阅读我的回答,我说明你需要插入代码的地方。必须更改Example类以匹配您创建PREFS_NAME静态变量的类。
即使在填充数据后,它仍会在登录时跳转。我可以放置代码吗?
@sandiparmal随时可以编辑您的问题以向我们展示您的代码。如果您有大量代码,请使用像pastebin.com这样的代码粘贴代码。
非常感谢你的帮助......工作......你节省了我的时间
嘿,再给我一个帮助....当我按下后退按钮它仍然登录页面..
@sandiparmal你必须在开始一个新的登录活动后finish()。请看我的编辑。
AndroidManifest.xml中的android:noHistory="true"标志怎么样?
@TelmoMarques我认为即使他已经登录,如果用户更新了应用程序,它也会再次请求登录。我是谁?
@TelmoMarques这里的Example类是什么?
@MohammadHamoud只是你的课程,你实现你的代码。
@TelmoMarques和Forwarding?
@MohammadHamoud,Forwarding应替换为您的登录活动。该代码片段用于防止用户在成功登录后使用后退按钮返回登录屏幕。
@TelmoMarques是的我知道,但我想知道Forwarding.this和Example.this将如何与我们使用.this进行相同的活动
@MohammadHamoud似乎是一个我从未注意到的拼写错误!我已经更新了上面的回复。
您应该添加另一个空的活动(没有UI),然后再加载。
将@Telmo Marques描述的逻辑放在这个空活动中,该活动负责将用户定向到LoginScreen.Activity或Main.Activity
看到这里,回答@tozka
如何在条件下跳过第一个活动
使用SharedPreferences。例如,有一个布尔变量,并在应用程序启动时读取它。
在用户第一次启动应用程序的情况下,共享首选项中的变量将为false,因此启动登录屏幕并在成功登录后在共享首选项中将该布尔变量设置为true,以便当用户第二次获取共享首选项中的值时将是真的。因此,请跳过登录屏幕并启动主要活动。
要在SharedPreference中存储布尔值,请使用以下代码::
public static void saveBooleanInSP(Context _context, boolean value){
SharedPreferences preferences = _context.getSharedPreferences("PROJECTNAME", android.content.Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("ISLOGGEDIN", value);
editor.commit();
}//savePWDInSP()
要从SharedPreference获取getValue,请使用以下代码::
public static boolean getBooleanFromSP(Context _context) {
// TODO Auto-generated method stub
SharedPreferences preferences = _context.getSharedPreferences("PROJECTNAME", android.content.Context.MODE_PRIVATE);
return preferences.getBoolean("ISLOGGEDIN", false);
}//getPWDFromSP()
使用SharedPreferences。例如,保存一些值,并在登录Activity上读取它。
在我们的项目中,我们保存了令牌和用户ID。因此,如果用户已经登录,我们会跳过授权活动。
附:如果您的登录活动是您应用中的第一个,那么在开始另一个活动之前不要忘记完成它,以防止在其他活动中按"返回"键。
我存储这个值意味着哪个活动?
developer.android.com/guide/topics/data/data-storage.html#pref
使用令牌也是了解登录状态的好方法。在基于Oauth令牌登录时,当用户登录到应用程序时,他们将在成功登录时获得访问令牌,并以安全的方式保存在客户经理中。用户打开应用程序首先检查令牌的可用性,如果可用,则重定向到主页面,否则返回登录活动。