0

ログイン アクティビティに向けられるスプラッシュ アクティビティがあります。ログインが true の場合、ユーザーは直接ホームに戻りますが、ユーザーがホームに戻ると、アプリケーションは自動的に閉じます。しかし、問題は、ユーザーがアプリケーションを開いたときに、ログアウトしていなくても、再度ログインする必要があることです。では、スプラッシュを家庭での活動に向けるにはどうすればよいでしょうか。私はそれを処理するために共有設定を使用する必要があるので、それを使用する必要があることを読みましたが、それを使用してログインを自動的に処理する方法がわかりません。これは私のスパッシュです:

public class SplashEpolicy extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {

    //hide title bar
    BasicDisplaySettings.toggleTaskBar(SplashEpolicy.this, false);
    //show status bar
    BasicDisplaySettings.toggleStatusBar(SplashEpolicy.this, true);

    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash_epolicy);

    Thread timer = new Thread() {
        public void run() {
            try {
                //this is configuration for how long the splash will be shown.
                //
                int time = Integer.parseInt(getResources().getString(R.string.splashTransTime));
                sleep(time);
            } catch (InterruptedException e) {
                // TODO: handle exception
                e.printStackTrace();
            } finally {
                //line below is for direct new activity that will be run after 
                //current activity finished.
                Intent intent = new Intent(SplashEpolicy.this,EpolicyMainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);      
                finish();
            }
        }
    };
    timer.start();      
}

これは、共有設定を含む私のログイン アクティビティです。

                String KEY = jo.getString("key");
                SharedPreferences settings = getSharedPreferences("PREFS_NAME", 0);
                SharedPreferences.Editor editor = settings.edit();
                editor.putString("etUser", strUser);
                editor.putString("key",KEY);
                editor.commit();
                System.out.println(KEY+""+"key"+""+"etUser");

                Dialog.dismiss();
                Intent i = new Intent(LoginActivity.this,EpolicyMainTab.class);
                startActivity(i);

        }
        }catch (JSONException e) {
            e.printStackTrace();
        }

これが私のホームです(EpolicyListPolisActivity):

    public class EpolicyListPolis extends ListActivity {
    static String PEMEGANG="PEMEGANG";
    static String POLIS="POLIS";
    static String STATUS="STATUS";
    static String TERTANGGUNG="TERTANGGUNG";
    String KEY, strUser;
    List NasabahList= new ArrayList();
    private ProgressDialog Dialog;
    private String strStoragePath = "",
            strNameFileDiv = "";
    ImageView LogoutButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTitle(R.string.Nomor_Polis);


        setContentView(R.layout.epolicy_list_polis);
        SharedPreferences settings = getSharedPreferences("PREFS_NAME", 0);
        strUser= settings.getString("etUser", null);
        KEY = settings.getString("key", null);
        LogoutButton=(ImageView)findViewById(R.id.LogoutButton);

        new NasabahAsyncTask().execute();

        LogoutButton.setOnClickListener(new OnClickListener(){
            public void onClick(View v) {
                dialogSignOut();
            }
        });
            }
public class NasabahAsyncTask extends AsyncTask<Void, Void, String>{
    String url = ("http://www.example.com?i="+strUser+"&k="+KEY);
    public NasabahAsyncTask() {
        this.url=url;
        // TODO Auto-generated constructor stub
    }

    protected void onPreExecute() {
        super.onPreExecute();   
        Dialog = ProgressDialog.show(EpolicyListPolis.this, "", "Melakukan Pengambilan Data");
    }

@Override
protected String doInBackground(Void... params) {
    String result="";
    try {
        result=Connection.get(url);
    }catch (Exception e){
        result=" ";
        Log.d("test viewer",e.getMessage());
    }
    return result;
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    fetchResponse(result.replace("\n", "").trim());

    ListAdapter adapter = new SimpleAdapter(
            EpolicyListPolis.this, NasabahList, R.layout.epolicy_polis_listitem,
            new String[] {POLIS, PEMEGANG, TERTANGGUNG, STATUS}, new int [] {R.id.polis, R.id.pemegang, R.id.tertanggung, R.id.status});

        setListAdapter(adapter);
    Dialog.dismiss();
    ListView lv = getListView();

    lv.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            String POLIS = ((TextView)view.findViewById(R.id.polis)).getText().toString();

            SharedPreferences settings = getSharedPreferences("PREFS_NAME", 0);
            SharedPreferences.Editor editor = settings.edit();
            editor.putString("POLIS", POLIS);
            editor.commit();
            }
}

private void fetchResponse(String result) {
    // TODO Auto-generated method stub
    if (!result.equals("")) {
        try {
            JSONArray jsonArray = new JSONArray(result);
            for (int i = 0; i < jsonArray.length(); i++) {

                JSONObject jsonObject = jsonArray.getJSONObject(i);
                HashMap<String, String> map = new HashMap<String, String>();
                if (jsonObject.has("PEMEGANG")) 
                    map.put("PEMEGANG", jsonObject.get("PEMEGANG").toString());
                if (jsonObject.has("POLIS")) 
                    map.put("POLIS", jsonObject.get("POLIS").toString());
                if (jsonObject.has("STATUS")) 
                    map.put("STATUS", jsonObject.get("STATUS").toString());
                if (jsonObject.has("TERTANGGUNG")) 
                    map.put("TERTANGGUNG", jsonObject.get("TERTANGGUNG").toString());
                NasabahList.add(map);
                System.out.println("json oke");
}
        }catch (JSONException e) {

            e.printStackTrace();
        }

        }
    }
@Override
public void onBackPressed() {
    dialogExit();
}
public void dialogExit()
{
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("do you want to exit?")
           .setCancelable(false)
           .setPositiveButton("Ya", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   Intent itSplashEnd = new Intent(EpolicyListPolis.this, SplashEnd.class);
                   //setIntent.addCategory(Intent.CATEGORY_HOME);
                   itSplashEnd.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
                   itSplashEnd.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                   startActivity(itSplashEnd);
                   finish();
                   System.exit(0);
               }
           })
           .setNegativeButton("no", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
               }
           });
    AlertDialog alert = builder.create();
    alert.show();
}

public void dialogSignOut()
{
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Sign out?")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
               // what will i do here?

                   Intent itSignOut = new Intent(EpolicyListPolis.this, EpolicyMainActivity.class);
                   itSignOut.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                   startActivity(itSignOut);
                   finish();
               }
           })
           .setNegativeButton("no", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
               }
           });
    AlertDialog alert = builder.create();
    alert.show();
}

    }

では、sharedpreferences を使用して再度ログイン アクティビティに行かずに自動的にホームにサインインする方法は? また、ユーザーがサインアウトするたびに sharedpreferences に保存されたデータを消去する方法は?

4

5 に答える 5

2

Gokul Nath の回答の何が問題なのかわかりませんが、もう一度試してみましょう。単純な if によって、ユーザーがすでにログインしているかどうかを確認できます。まず、ユーザー データをロードします (ユーザー名とパスワードを想定してみましょう)。

SharedPreferences prefs = this.getSharedPreferences("com.project.myProject", Context.MODE_PRIVATE);
String savedUser = "com.project.myProject.savedUser";
String user = prefs.getString(savedUser, "none"); // return "none" if user is not logged in
String savedPass = "com.project.myProject.savedPass";
String pass = prefs.getString(savedPass, "none");

if (user.equalsIgnoreCase("none") || pass.equalsIgnoreCase("none")) {
    // Show a log in dialog and/or other stuff to let user log in
} else {
    // Launch your main interface
}

これは、アプリを初めて起動する場合、またはログアウト後に機能します。ログアウト時に、次のようにすべての SharedPreferences をクリアできます (注意: SharedPreferences のクリアまたはリセットは私にとって同じです):

YourActivity.this.getSharedPreferences("com.project.myProject", Context.MODE_PRIVATE).edit().clear().commit();

これにより、ユーザーがアプリを再度起動した場合、ユーザーは再度ログインする必要があります。

あなたのコードで私が見たもう一つのことはこれです:

Intent intent = new Intent(SplashEpolicy.this,EpolicyMainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);      
finish();

戻るボタンを押すとアプリが SplashEpolicy に戻るため、意図的にフラグを追加したと思います。私が正しい場合は、マニフェストにこの行「android:noHistory="true"」を追加することで、コードをより適切に実行できます(間違っている場合は、回答のこの部分をスキップしてください):

<activity
    android:name="com.project.myProject.SplashEpolicy"
    android:label="@string/app_name"
    android:noHistory="true" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

これにより、スプラッシュ アクティビティは履歴の痕跡を残しません。タスクのアクティビティ スタックに残らないため、ユーザーはそこに戻ることができません (cit. Android Dev サイト)。

于 2013-06-13T09:29:50.003 に答える
2

自動的にサインインするには:

ログイン情報が に保存されているかどうかを確認しますSharedPreferences。見つかった場合は、その値を取得して自動的にログインできます。

SharedPreferences prefs = this.getSharedPreferences("YOUR_PREF_NAME", Context.MODE_PRIVATE);

String loginID = prefs.getString("LOGIN_ID", "");
String loginPWD = prefs.getString("LOGIN_PWD", "");

if (loginID.length()>0 && loginPWD.length()>0) {
     //YOUR LOGIN CODE
} else {
     //SHOW PROMPT FOR LOGIN DETAILS
}

サインアウト時にデータをクリアするには、サインアウト コマンドで次のコードを使用できます。

SharedPreferences prefs = this.getSharedPreferences("YOUR_PREF_NAME", Context.MODE_PRIVATE);
Editor editor = prefs.edit();
editor.putString("LOGIN_ID", "");     //RESET TO DEFAULT VALUE
editor.putString("LOGIN_PWD", "");     //RESET TO DEFAULT VALUE
editor.commit();
于 2013-06-13T08:26:18.147 に答える
0

ブール値を使用して、ログイン状態を追跡できます。つまり、ログインしている場合は true、それ以外の場合は false です。スプラッシュ画面でこのブール変数の値を確認して、false の場合に備えてログイン ダイアログを開くことができます。上記のブール値を格納する簡単な方法を次に示します。

SharedPreferences sharedPrefs = getSharedPreferences("youPrefsFile", 0);
SharedPreferences.Editor editor = sharedPrefs.edit();
editor.putBoolean("isLoggedIn", true);
editor.commit();

そして、その値を取得する簡単な方法:

SharedPreferences settings = getSharedPreferences("youPrefsFile",0);
boolean isLoggedin = settings.getBoolean("isLoggedIn", false);

それが役に立てば幸い。

于 2013-06-13T08:30:23.200 に答える