【问题标题】:Save Session Android保存会话 Android
【发布时间】:2014-09-25 13:23:52
【问题描述】:

我想让我的应用程序保存会话以在我终止进程时不再登录:当我登录 Main.java 时,他将我重定向到 Menu.java 然后在我再次杀死进程后,他应该采取我直接进入 Menu.java 无需登录并保存用户名

一模一样的短裙http://www.tutorialspoint.com/android/android_session_management.htm

这是 Main.java “登录页面”

public class Main extends Activity {
Button b;
EditText et,pass;
TextView tv;
HttpPost httppost;
StringBuffer buffer;
HttpResponse response;
HttpClient httpclient;
List<NameValuePair> nameValuePairs;
ProgressDialog dialog = null;

public static final String data = "ett";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button exit = (Button)findViewById(R.id.button18);

   exit.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            finish();
            Intent exit = new Intent(Intent.ACTION_MAIN);
            exit.addCategory(Intent.CATEGORY_HOME);
            exit.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(exit);

        }
    });

    b = (Button)findViewById(R.id.Button01);  
    et = (EditText)findViewById(R.id.username);
    pass= (EditText)findViewById(R.id.password);
    tv = (TextView)findViewById(R.id.tv);

    b.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            dialog = ProgressDialog.show(Main.this, "", 
                    "Verification ...", true);
             new Thread(new Runnable() {
                    public void run() {
                        login();                          
                    }
                  }).start();               
        }
    });
}

void login(){
    try{            

        httpclient=new DefaultHttpClient();
        httppost= new HttpPost("http://192.168.1.4/android/etc.php"); // make sure the url is correct.
        //add your data
        nameValuePairs = new ArrayList<NameValuePair>(2);
        // Always use the same variable name for posting i.e the android side variable name and php side variable name should be similar, 
        nameValuePairs.add(new BasicNameValuePair("username",et.getText().toString().trim()));  // $Edittext_value = $_POST['Edittext_value'];
        nameValuePairs.add(new BasicNameValuePair("password",pass.getText().toString().trim())); 
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        //Execute HTTP Post Request
        response=httpclient.execute(httppost);
        // edited by James from coderzheaven.. from here....
        ResponseHandler<String> responseHandler = new BasicResponseHandler();
        final String response = httpclient.execute(httppost, responseHandler);
        System.out.println("Response : " + response); 
        runOnUiThread(new Runnable() {
            public void run() {
                tv.setText("Response from PHP : " + response);
                dialog.dismiss();
            }
        });

        if(response.equalsIgnoreCase("User Found")){
            runOnUiThread(new Runnable() {
                public void run() {
                    Toast.makeText(Main.this,"Login Success", Toast.LENGTH_SHORT).show();
                }
            });

            SharedPreferences setting = getSharedPreferences(data, 0);
            SharedPreferences.Editor editor = setting.edit();
            editor.putString("et", et.getText().toString());
            editor.commit();
            Intent intent=new Intent(Main.this, Menu.class);

            startActivity(intent);
        }else{
            showAlert();                
        }

    }catch(Exception e){
        dialog.dismiss();
        System.out.println("Exception : " + e.getMessage());
    }
}
public void showAlert(){
    Main.this.runOnUiThread(new Runnable() {
        public void run() {
            AlertDialog.Builder builder = new AlertDialog.Builder(Main.this);
            builder.setTitle("Erreur d'identification");
            builder.setMessage("Code ou mot de passe incorrecte")  
                   .setCancelable(false)
                   .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int id) {
                       }
                   });     

            AlertDialog alert = builder.create();
            alert.show();               
        }
    });


}

}

Menu.java 保存会话后应用应该在哪里启动

public class Menu extends ActionBarActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.menus);

    Button button1 = (Button)findViewById(R.id.button1);
    Button button3 = (Button)findViewById(R.id.button3);
    Button button4 = (Button)findViewById(R.id.button4);
    Button button14 = (Button)findViewById(R.id.button14);
    Button button5 = (Button)findViewById(R.id.button5);
    Button exit = (Button)findViewById(R.id.button18);

    button1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent1 = new Intent(Menu.this, emploi.class);
            startActivity(intent1);
        }
    });

    button3.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent2 = new Intent(Menu.this, Maritimnews.class);
            startActivity(intent2);
        }
    });

    button4.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent3 = new Intent(Menu.this, Resultats.class);
            startActivity(intent3);
        }
    });

    button14.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent4 = new Intent(Menu.this, Demande.class);
            startActivity(intent4);
        }
    });

    button5.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent5 = new Intent(Menu.this, Apropos.class);
            startActivity(intent5);
        }
    });

    exit.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            finish();
            Intent exit = new Intent(Intent.ACTION_MAIN);
            exit.addCategory(Intent.CATEGORY_HOME);
            exit.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(exit);

        }
    });


    }



}

我不知道我将 sharedpreferces 放在哪里以使其保存会话 那里的 sharedpreferences 仅用于在 Main.java 和 Menu.java 之间传递数据 我不想添加另一个 sheredPreferences 来保存像 facebook 这样的会话意味着当我登录 Main.java ---redirecte--> Menu.java 所以如果我再次关闭运行应用程序,他将从 Menu.java 开始 :) 和谢谢

【问题讨论】:

    标签: java android session sharedpreferences


    【解决方案1】:

    我使用 mySharedPreferences 向我指示用户是否已经登录,并且我从以前的活动中传递一个 int 值以了解用户是否刚刚进入应用程序。

    public class ConnectWithFaceBookActivity extends Activity{
    
        int mode = Activity.MODE_PRIVATE;
        private SharedPreferences  mySharedPreferences;
        private String TAG = "ConnectWithFaceBookActivity";  
        private TextView lblEmail;
        private String accessToken;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.connect_with_facebook);
    
            mySharedPreferences =  this.getSharedPreferences( "facebook", Context.MODE_PRIVATE);
            final SharedPreferences.Editor editor= mySharedPreferences.edit();
            lblEmail = (TextView) findViewById(R.id.lblEmail);
            LoginButton authButton = (LoginButton) findViewById(R.id.authButton);
            Intent i = getIntent();
            int logout = i.getIntExtra("LOGOUT", 0);
    
            //checking if already sign in
            if(logout!=1 && mySharedPreferences.getString("email","")!="")//1 represent logout button preesed
            {
                String mString;
                mString= mySharedPreferences.getString("email","");
                lblEmail.setText(mString);
    
                Intent intent = new Intent(getApplicationContext(),MainActivity.class); 
                startActivity(intent);
                finish();  
            }
    
            authButton.setOnErrorListener(new OnErrorListener() {
    
                @Override
                public void onError(FacebookException error) {
                    Log.i(TAG, "Error " + error.getMessage());
                }
            }); 
    
            // set permission list, Don't foeget to add email
            authButton.setReadPermissions(Arrays.asList("public_profile","user_friends","email"));
    
            // session state call back event
            authButton.setSessionStatusCallback(new Session.StatusCallback() 
            {
                @Override
                public void call(Session session, SessionState state, Exception exception) 
                {
    
                    Boolean open = session.isOpened();
    
                    if (open) 
                    {
                        Log.i(TAG,"Access Token"+ session.getAccessToken());
                        accessToken = session.getAccessToken();
                        Request.newMeRequest (session, new Request.GraphUserCallback() 
                        {
                            @Override
                            public void onCompleted(GraphUser user,Response response) 
                            {
                                if (user != null) 
                                { 
                                    Log.i(TAG,"User ID "+ user.getId());
                                    Log.i(TAG,"Email "+ user.asMap().get("email"));
                                    String str = user.asMap().get("email").toString();
                                    lblEmail.setText(str);
    
                                    editor.putBoolean("isLogIn",true);
                                    editor.putString("email",str);
    
                                    //save the changes that you made
                                    editor.commit();
                                    Intent intent = new Intent(getApplicationContext(),MainActivity.class); 
                                    startActivity(intent);
                                    finish();
                                }
                            }
                        }).executeAsync();
                    }
                    else
                    {
                        editor.putBoolean("isLogIn",false);
                        editor.putString("email","");
    
                        //save the changes that you made
                        editor.commit();
                    }
                }
            });
        }
    
        public static void callFacebookLogout(Context context) {
            Session session = Session.getActiveSession();
            if (session != null) {
                if (!session.isClosed()) {
                    session.closeAndClearTokenInformation();
                    //clear your preferences if saved
                }
            } else {
    
                session = new Session(context);
                Session.setActiveSession(session);
    
                session.closeAndClearTokenInformation();
                    //clear your preferences if saved
            }
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
        }
    }
    

    【讨论】:

    • 我修复了您的代码,使其具有一致的 4 个空格/缩进级别(并减少了空白行以限制滚动);但是您确实还应该决定将开头的{'s 放在上一行还是新行。上一行是 Java 中更常见的约定;但只要你保持一致,任何一个都是可以接受的。无论您喜欢什么,将两者混合在一起看起来都很丑。
    【解决方案2】:

    如果您采用这种方式,用户将只在您的应用程序中登录一次,并且将永远保持连接。最好是这样做: 首先添加一个复选框来登录,让用户决定是否要保存他的登录信息。 如果选中则添加共享首选项,如果取消选中则删除共享首选项。 在主活动的 onresume() 方法中读取 sharedpreferences,如果首选项不为空,则将一些逻辑直接添加到菜单活动中

    【讨论】:

    • 你能举个例子吗?因为我不知道我把代码放在哪里
    • 只需在登录 xml 中添加一个复选框,并为登录按钮的 onclick 事件添加逻辑。然后将意图登录添加到 @Override protected void onResume() {}
    猜你喜欢
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2020-01-23
    相关资源
    最近更新 更多