草庐IT

Android:将用户名保留在 session 中直到注销

coder 2023-12-06 原文

我很难弄清楚如何使用 SharedPreferences 将用户名存储在手机中并保持 session 状态直到注销。我还需要知道它如何同时在 session 中将用户名与用户在 ListView 中单击的数据一起发送出去。以下是我正在使用的代码,我想知道为了实现这个目标而放置的位置和代码。作为登录,它将转到菜单并停留在菜单上(避免后退按钮返回登录屏幕)每个菜单都有一个注销项,它将返回登录屏幕。

我之前看过的问题是 thisthis

日志详细信息

05-26 10:42:19.146: WARN/KeyCharacterMap(26071): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
05-26 10:42:23.926: DEBUG/AndroidRuntime(26071): Shutting down VM
05-26 10:42:23.926: WARN/dalvikvm(26071): threadid=3: thread exiting with uncaught exception (group=0x40013140)
05-26 10:42:23.926: ERROR/AndroidRuntime(26071): Uncaught handler: thread main exiting due to uncaught exception
05-26 10:42:23.936: ERROR/AndroidRuntime(26071): java.lang.NullPointerException
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at com.merrill2.Login$1.onClick(Login.java:42)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at android.view.View.performClick(View.java:2232)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at android.view.View.onTouchEvent(View.java:3905)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at android.widget.TextView.onTouchEvent(TextView.java:6414)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at android.view.View.dispatchTouchEvent(View.java:3421)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1707)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1197)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at android.app.Activity.dispatchTouchEvent(Activity.java:1993)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1691)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1533)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at android.os.Looper.loop(Looper.java:123)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at android.app.ActivityThread.main(ActivityThread.java:3992)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at java.lang.reflect.Method.invokeNative(Native Method)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at java.lang.reflect.Method.invoke(Method.java:521)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
05-26 10:42:23.936: ERROR/AndroidRuntime(26071):     at dalvik.system.NativeStart.main(Native Method)
05-26 10:42:23.946: INFO/Process(899): Sending signal. PID: 26071 SIG: 3
05-26 10:42:23.956: INFO/dalvikvm(26071): threadid=7: reacting to signal 3
05-26 10:42:23.966: INFO/dalvikvm(26071): Wrote stack trace to '/data/anr/traces.txt'
05-26 10:42:25.646: DEBUG/dalvikvm(25722): GC freed 973 objects / 63040 bytes in 93ms
05-26 10:42:27.777: DEBUG/DispatchService(945): Handled message = TIMED_SERVICE_UNMASK
05-26 10:42:29.856: DEBUG/DispatchService(945): DISPATCH SERVICE getIdenPacketDataState: returning: 4
05-26 10:42:29.876: INFO/iDENWAPReceiver(953): Received a android.intent.action.ANY_DATA_STATE

登录.java

public class Login extends Activity {
    protected static final SharedPreferences settings = null;
    private EditText etUsername;
    private Button btnLogin;
    private Button btnCancel;
    private TextView lblResult;
    /** Called when the activity is first created. */
    //@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        etUsername = (EditText)findViewById(R.id.username);
        btnLogin = (Button)findViewById(R.id.login_button);
        btnCancel = (Button)findViewById(R.id.cancel_button);
        lblResult = (TextView)findViewById(R.id.result);

        btnLogin.setOnClickListener(new OnClickListener() {
            //@Override
            public void onClick(View v) {
            // Check Login
            String username = etUsername.getText().toString();

            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            SharedPreferences.Editor editor = settings.edit();
            editor.putString("username", username);

            if(username.equals("1111")){
                lblResult.setText("Login successful.");

                //startActivity(new Intent(this, Activity2.class));


                Intent i = new Intent(getApplicationContext(), Customer.class);
                startActivity(i);

如果我去掉下面的行:

protected static final SharedPreferences settings = null;

我把这个:

btnLogin.setOnClickListener(new OnClickListener() {
            private SharedPreferences settings;

“设置”出错所以我不得不使用上面提到的那些行之一

最佳答案

要添加用户,只需执行以下操作:

import android.preference.PreferenceManager;
....
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = settings.edit();
editor.putString("username", username);

并在注销中删除它:

SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = settings.edit();
editor.remove("username");

通过这种方式,您可以确保用户只持续一个 session ,直到注销。当您打开您的应用程序时,您应该进行检查(以防万一),如果发生错误,请查看是否已经从上一个 session 设置了用户名。

至于在 ListView 中传递数据,您必须手动完成。 SharedPreference 框架负责处理其他一切。

关于Android:将用户名保留在 session 中直到注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6112269/

有关Android:将用户名保留在 session 中直到注销的更多相关文章

  1. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  2. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  3. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

  4. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  5. ruby-on-rails - Rails 优雅地处理超时 session ? - 2

    使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p

  6. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  7. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

  8. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  9. ruby - HTTP 请求中的用户代理,Ruby - 2

    我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)

  10. ruby-on-rails - capybara poltergeist - 覆盖用户代理 - 2

    有人知道如何将capybarapoltergeist的用户代理覆盖到移动用户代理以进行测试吗?我发现了一些有关为seleniumwebdriver配置它的信息:http://blog.plataformatec.com.br/2011/03/configuring-user-agents-with-capybara-selenium-webdriver/这在capybara闹鬼中怎么可能? 最佳答案 请参阅poltergeistgithub页面上的链接:https://github.com/teampoltergeist/polte

随机推荐