0

我正在开发需要用户登录的android应用程序。该应用程序依赖Web服务器验证用户详细信息,以便用户可以登录。我的问题从这里开始,登录用户没有问题,但是当用户按下主页按钮并返回应用程序时,会显示登录屏幕这是非常糟糕的。

我听说过 SharedPrefrences 但我不知道如何使用它保存用户详细信息,以便用户可以直接移动到主要活动。

我在这里包含了我的源代码。如果任何熟悉 SharedPrefrences 的人可以帮助我解决这个问题。我的鳕鱼的例子会很有帮助。

using System;

using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Locations;
using RestSharp;
using TheNorthStar.Api.Requests;
using TheNorthStar.Api.Results;
using NorthStar.Driver.Application;
using Android.Preferences;
using Object = Java.Lang.Object;


namespace NorthStar.Driver
{
    public class DriverLogonAsync : AsyncTask

    {
        private ProgressDialog processDialog;
        private Context m_context;
        private DriverLogon m_driver;

        private bool _resterror;

        public DriverLogonAsync( Context context, DriverLogon driver )
        {
            m_context = context;
            m_driver = driver;

            _resterror = false;
        }

        /*
         * throws
         * should separate out logic and use MyMessagebox..
         */
        private void SetComfirmAlertBox(string carNum, DriverLogonResult result)
        {
            var api = new ConnectToSever(Helper.GetServer(m_context));
            string resultOfCarDetail; CarDetails res;
            try
            {
                resultOfCarDetail = api.ComfirmLogginOn(m_driver);
            }
            catch
            {
                Android.Util.Log.Info("EXC_conflogon1", "confirm logging on failed");
                throw;
            }
            try
            {
                res = Newtonsoft.Json.JsonConvert.DeserializeObject<CarDetails>(resultOfCarDetail);
            }
            catch (Exception ex)
            {
                Android.Util.Log.Info("EXC_conflogon2", "deserialize confirm logging on failed\n" + ex.Message);
                throw;
            }

            if (res.carExists != true)
            {
                MyMessageBox.SetAlertBox("Opps!!!!!!!!", "This Car Number Was Wrong!!!!", "OK", m_context);
            }
            else
            {
                string carType = res.carType;
                string seatNum = res.numOfSeats.ToString();
               // MainActivity act = new MainActivity( result.driverId );
                var mact = new Intent(m_context,typeof(MainActivity) );
                mact.PutExtra( "driverID",  result.driverId.ToString() );
                MyMessageBox.SetAlertBox("Comfirm!", "Your car is a: " + carType + " with " + seatNum + " seats??", "Yes", "No", mact,m_context);


            }
        }

        /*private void ChangeDriverStatues()
        {

        }*/

        protected override void OnPreExecute()
        {
            base.OnPreExecute();
            processDialog = ProgressDialog.Show( m_context, "Driver Loging On...", "Please Wait...", true, true);
        }



        protected override Object DoInBackground(params Object[] @params)
        {
            var api = new ConnectToSever(Helper.GetServer(m_context));

            string res = string.Empty;
            try
            {
                res = api.DriverLogingOn(m_driver);
            }
            catch
            {
                _resterror = true;
                Android.Util.Log.Info("EXC_dlogon1", "driver logon failed");
                return -1;
            }
            return res;
        }

        protected override void OnPostExecute(Object result)
        {
            base.OnPostExecute(result);
            //hide and kill the progress dialog
            processDialog.Hide();
            processDialog.Cancel();

            if (_resterror == true)
            {
                Android.Util.Log.Info("EXC_dlogon2", "logon connection has failed, noop");
                return;
            }

            DriverLogonResult resDriverDetail;
            try
            {
                resDriverDetail = Newtonsoft.Json.JsonConvert.DeserializeObject<DriverLogonResult>(result.ToString());
            }
            catch (Exception ex)
            {
                Android.Util.Log.Info("EXC_dlogon3", "logon deser has failed, noop\n" + ex.Message);
                return;
            }

            if (resDriverDetail.logonSuccess)
            {
                this.SetComfirmAlertBox( m_driver.carNum, resDriverDetail );  
            }
            else
            {
                MyMessageBox.SetAlertBox("Wrong!", "Wrong username or password!!!", "OK!",m_context);
            }
        }
    }

    [Activity(Label = "MyDriver-Driver", MainLauncher = true, Icon = "@drawable/icon")]
    public class Activity1 : Activity
    {
        private void CreateAlert()
        {

            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.SetTitle("GPS is Off")
                .SetMessage("You need GPS to you this application."+ "\n" +
                             "Do you want to go to settings menu?")
                .SetPositiveButton("Setting",
                    (sender, e) =>
                    {
                        Intent intent = new Intent(Android.Provider.Settings.ActionLocationSourceSettings);
                        StartActivity(intent);
                        this.Finish();
                    })
                    .SetNegativeButton("No", (sender, e) => this.Finish());

            AlertDialog alert = builder.Create();
            alert.Show();
        }
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            Android.Util.Log.Info("EXC_logstart", "**************** starting driver module ****************");

            Boolean isGPSEnabled = false;
            Boolean isNetworkEnabled = false;
            LocationManager _locationManager;
            _locationManager = (LocationManager)GetSystemService(LocationService);
            isGPSEnabled = _locationManager.IsProviderEnabled(LocationManager.GpsProvider);

            // getting network status
            isNetworkEnabled = _locationManager.IsProviderEnabled(LocationManager.NetworkProvider);

            if (!isGPSEnabled && !isNetworkEnabled)
            {
                CreateAlert();
            }

            // Get our button from the layout resource,
            // and attach an event to it
            EditText eTextUsername = FindViewById<EditText>(Resource.Id.UserNameBox);
            EditText eTextPassword = FindViewById<EditText>(Resource.Id.PasswordBox);
            EditText eTextCarNum = FindViewById<EditText>(Resource.Id.CarNumBox);
            Button viewPrefsBtn = FindViewById<Button>(Resource.Id.BtnViewPrefs);
            Button button = FindViewById<Button>(Resource.Id.MyButton);

            button.Click += delegate 
            {
                if (eTextCarNum.Text != "" && eTextPassword.Text != "" && eTextUsername.Text != "")
                {
                    DriverLogon driver = new DriverLogon();
                    driver.userName = eTextUsername.Text;
                    driver.password = eTextPassword.Text;
                    driver.carNum = eTextCarNum.Text;
                    DriverLogonAsync asyDriver = new DriverLogonAsync(this, driver);
                    asyDriver.Execute();
                }
            };

            viewPrefsBtn.Click += (sender, e) =>
            {
                StartActivity(typeof(PreferencesActivity));
            };
        }
    }
}
4

2 回答 2

2
public void savePrefrences(String key, String value)
    {
        SharedPreferences prefs = context.getSharedPreferences(context.getApplicationContext().getPackageName(), 0);
        prefs.edit().putString(key, value).commit();
    }

public String getPrefrences(String key)
    {
        SharedPreferences prefs = context.getSharedPreferences(context.getApplicationContext().getPackageName(), 0);
        return prefs.getString(key, "");
    }

这样,即使您关闭并重新打开它,您的信息也可以从应用程序的任何位置获得。

在您的登录屏幕上-当用户成功登录时savePrefrences("hasLoggenInPref", "true"); 现在,每当用户重新进入登录屏幕时-调用getPrefrences("hasLoggenInPref")并检查它是否equals "true",如果是,则跳转到您的主屏幕,如果不是,则显示登录屏幕。

您可能应该getPrefrences 从启动屏幕或其他地方调用该函数,如果它返回 true,则打开您的应用程序,如果不是,则打开登录屏幕。

当用户注销时,只需调用savePrefrences("hasLoggenInPref", "false");

希望这可以帮助。

于 2012-10-09T14:19:18.373 回答
0

不确定monodroid,但通常在您的应用程序中,所有需要授权的活动都必须从一个检查onResume用户是否具有有效会话的活动子类化(您在内存中存储有关成功登录的标志或会话ID,例如在您的Application班级中或任何适当的单例)。然后

  • 如果检查失败 - 将用户返回到登录屏幕
  • 如果成功 - 什么也不做,只是向他们展示他想要的活动

为避免活动堆栈出现问题(按主页按钮返回登录屏幕)并通过 Intent 在清单或相关属性中LoginActivity使用android:noHistory="true"

于 2012-10-09T14:22:13.650 回答