Android记住以前的登录(后台任务)

Posted

技术标签:

【中文标题】Android记住以前的登录(后台任务)【英文标题】:Android remembering previous login (backgroundtask) 【发布时间】:2017-01-24 18:52:08 【问题描述】:

我正在尝试登录以检查用户是否存在于 mysql 数据库中,但在运行应用程序时它会记住以前的登录详细信息。我认为问题出在后台任务中,好像我将其注释掉一样,我可以很好地敬酒登录详细信息。

public class Tab1Activity extends Activity 
   
    String task,username,password;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tab1);

        final Button buta = (Button) findViewById(R.id.button1);
        final Button butb = (Button) findViewById(R.id.button2);
        final TextView usernameTV = (TextView) findViewById(R.id.editText1);
        final TextView passwordTV = (TextView) findViewById(R.id.editText2);

        buta.setOnClickListener(new View.OnClickListener()
        
            public void onClick(View v)
            
                 SharedPreferences  preferences = getSharedPreferences("MYPREFS", Context.MODE_PRIVATE);
                 //editor = preferences.edit();

                 username=usernameTV.getText().toString(); 
                 password=passwordTV.getText().toString();
                 task="login";
                 Toast.makeText(getApplicationContext(), username+" "+password, Toast.LENGTH_SHORT).show();

                 // create and call background activity                                

                 BackgroundTask backgroundTaskLogin = new BackgroundTask(Tab1Activity.this);                
                 backgroundTaskLogin.execute(task,username,password);

                 //get data back from sharedpreference
                 String driver_exist = preferences.getString("myDatalogin","ERROR getting name");

                 //display datas
                 String[] loginSeparated = driver_exist.split(",");
                 Toast.makeText(getApplicationContext(), loginSeparated[0], Toast.LENGTH_SHORT).show();


               if (loginSeparated[0].equals("true"))
               

                int finalId = Integer.parseInt(loginSeparated[1]);   
                //Toast.makeText(getApplicationContext(), loginSeparated[1], Toast.LENGTH_SHORT).show();

                SharedPreferences.Editor editor = getSharedPreferences("MYPREFS",  Context.MODE_PRIVATE).edit();
                editor.putInt("TaxiDriverId", finalId);
                editor.apply();

                //once clicked - jump to tab2
                TabActivity tabs = (TabActivity) getParent();
                tabs.getTabHost().setCurrentTab(1);
               
               else
               
                   Toast.makeText(getApplicationContext(), "Wrong password", Toast.LENGTH_SHORT).show();
               
            
        );
    

    //////////////////////////////////////////////////////
    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.tab1, menu);
        return true;
        

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in androidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) 
            return true;
        
        return super.onOptionsItemSelected(item);
    

这是我认为问题所在的背景谈话。

public class BackgroundTask extends AsyncTask<String,Void,String>
    

        SharedPreferences preferences;
        SharedPreferences.Editor editor;
        SharedPreferences.Editor pig;

        Context context;

        BackgroundTask(Context ctx)
        
            this.context = ctx;
        

        @Override
        protected String doInBackground(String... params)
        
            String urlLogin  = "";
            preferences = context.getSharedPreferences("MYPREFS", Context.MODE_PRIVATE);
            editor = preferences.edit();
            editor.putString("flag","0");
            editor.commit();

            String task = params[0];
            String loginusername;
             String loginpassword;


            if (task.equals("login"))
                      
              urlLogin  = "http://super.com/LoginAndRegister-login.php";
              loginusername = params[1];
              loginpassword = params[2];



                try 
                
                    URL url = new URL(urlLogin);
                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                    httpURLConnection.setRequestMethod("POST");
                    httpURLConnection.setDoOutput(true);
                    httpURLConnection.setDoInput(true);


                    //send the driver number to the database
                    OutputStream outputStream = httpURLConnection.getOutputStream();
                    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"UTF-8");
                    BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);

                    String myDatalogin = URLEncoder.encode("identifier_loginEmail","UTF-8")+"="+URLEncoder.encode(loginusername,"UTF-8")
                    +"&"+URLEncoder.encode("identifier_loginPassword","UTF-8")+"="+URLEncoder.encode(loginpassword,"UTF-8");
                    bufferedWriter.write(myDatalogin);
                    bufferedWriter.flush();
                    bufferedWriter.close();
                    outputStream.close();

                    //get response from the database
                    InputStream inputStream = httpURLConnection.getInputStream();
                    InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"UTF-8");
                    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                    String dataResponse = "";
                    String inputLine = "";
                     while((inputLine = bufferedReader.readLine()) != null)
                     
                        dataResponse += inputLine;
                     
                    bufferedReader.close();
                    inputStream.close();
                    httpURLConnection.disconnect();

                    editor.putString("flag","login");
                    editor.commit();                                      
                    pig = preferences.edit();
                    pig.putString("myDatalogin",dataResponse);
                    pig.commit();               
                    return  dataResponse;
                 
                catch (MalformedURLException e)
                
                    e.printStackTrace();
                
                catch (IOException e)
                
                    e.printStackTrace();
                 

            //end if statement

【问题讨论】:

【参考方案1】:

当您完成Activity 调用finish() 后,这将确保下次启动活动时它会重新开始。还要查看AndroidManifest.xmlActivity 标记中的launchMode 属性,以确保您正确地开始了您的活动。 https://developer.android.com/guide/topics/manifest/activity-element.html

【讨论】:

感谢您的反馈。该代码有效,但似乎我需要单击两次才能登录,就好像它缓冲了以前的用户名/密码一样。

以上是关于Android记住以前的登录(后台任务)的主要内容,如果未能解决你的问题,请参考以下文章

Android 8.0 AlarmManager 后台定时任务

ios后台和android后台区别 iOS/Android系统多任务浅析

Uwp 在用户登录时执行后台任务

从后台任务中更新android UI

多个操作的后台任务 - Android

Android 计划后台任务的最佳实践