2017-02-27 202 views
0

我有一個使用共享首選項進行會話管理的項目。代碼的一切都很好,但真正令人討厭的是,應用程序在Android Lollipop及以上版本中保持會話,但不幸的是,Android Kitkat和以下版本不支持此功能。每當應用程序關閉時,會話都會丟失,您必須重新登錄。以下是代碼,我使用:共享首選項不佔用會話(Android K)

Session.java

package com.saptak.disputesession; 
import android.content.Context; 
import android.content.SharedPreferences; 
import java.util.HashMap; 
/** 
* Created by Saptak Das on 27-02-2017. 
*/ 

public class Session { 

    SharedPreferences sharedPreferences; 
    SharedPreferences.Editor editor; 

    Context context; 

    public static String KEY_FNAME="namef"; 
    public static String KEY_LNAME="namel"; 
    public static String IS_LOGIN; 

    public Session(Context context) { 
     this.context = context; 
     sharedPreferences=context.getSharedPreferences("userdetails",0); 
     editor=sharedPreferences.edit(); 
    } 

    public void CreateLoginSession(String fname,String lname) 
    { 
     editor.putString(KEY_FNAME,fname); 
     editor.putString(KEY_LNAME,lname); 
     editor.putString(IS_LOGIN,"logged"); 
     editor.commit(); 
    } 

    public HashMap<String,String> getdetails() 
    { 
     HashMap<String,String> details=new HashMap<>(); 
     details.put(KEY_FNAME,sharedPreferences.getString(KEY_FNAME,null)); 
     details.put(KEY_LNAME,sharedPreferences.getString(KEY_LNAME,null)); 
     return details; 
    } 

    public boolean loginstatus() 
    { 
     if(sharedPreferences.getString(IS_LOGIN,"unlogged").equals("logged")) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    public void logoutac() 
    { 
     editor.clear(); 
     editor.commit(); 
    } 
} 

Login.java

package com.saptak.disputesession; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 

/** 
* Created by Saptak Das on 27-02-2017. 
*/ 

public class Login extends Activity { 

    Button login; 
    EditText first,last; 

    Session session; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.layout); 
     session=new Session(getApplicationContext()); 
     login=(Button)findViewById(R.id.log); 
     first=(EditText)findViewById(R.id.fname); 
     last=(EditText)findViewById(R.id.lname); 
     login.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       session.CreateLoginSession(first.getText().toString(),last.getText().toString()); 
       startActivity(new Intent(getApplicationContext(), MainActivity.class)); 
       finish(); 
      } 
     }); 
    } 
} 

MainActivity.java

package com.saptak.disputesession; 

import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

import java.util.HashMap; 

public class MainActivity extends AppCompatActivity { 

    Session session; 
    Boolean flag; 

    TextView tf,tl; 

    Button logout; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     session=new Session(getApplicationContext()); 
     tf=(TextView)findViewById(R.id.xfname); 
     tl=(TextView)findViewById(R.id.xlname); 
     logout=(Button)findViewById(R.id.xlogout); 
     flag=session.loginstatus(); 
     if(flag==false) 
     { 
      startActivity(new Intent(getApplicationContext(),Login.class)); 
      finish(); 
     } 
     HashMap<String,String> details=session.getdetails(); 
     tf.setText(details.get(Session.KEY_FNAME)); 
     tl.setText(details.get(Session.KEY_LNAME)); 
     logout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       session.logoutac(); 
       startActivity(new Intent(getApplicationContext(),Login.class)); 
       finish(); 
      } 
     }); 
    } 
} 

這個問題現在讓我感到緊張,因爲應用程序是完全編碼的,請幫助我。提前致謝!

更新:

請注意,這個問題是不是刪除會話,它的完全相反。每次我關閉應用程序時,會話都會記錄下來。並且此問題僅適用於Android Kitkat及其以下版本,適用於Android棒棒糖及以上版本的工作正常

+0

相反editor.commit的'();'用'editor.apply();'。 –

+0

@WadeTyler我使用了editor.apply(),但它不起作用。在關閉應用程序後會話丟失 –

+0

@IntelliJAmiya問題不在於刪除共享首選項,而是與其相反。會話丟失,當我關閉應用程序,因爲我已經說過問題 –

回答

0

SharedPreferences允許您以鍵值對的形式保存和檢索數據。

錯誤

public static String IS_LOGIN="logged"; // Init here 

僅供參考,當你想通過 全球存儲用戶數據從應用

會議是有用的。

整頓你的方法

public void CreateLoginSession(String fname,String lname) 
{ 
    editor.remove(KEY_FNAME); //Remove at first 
    editor.remove(KEY_LNAME); 
    editor.remove(IS_LOGIN); 
    editor.putString(KEY_FNAME,fname); 
    editor.putString(KEY_LNAME,lname); 
    editor.putString(IS_LOGIN,"logged"); 
    editor.commit(); 
}