0

嗨我試圖檢測我的應用程序是否已經第一次打開。如果有,我需要運行一個活動,一旦它第二次打開,它不應該再次顯示它。Android使用共享首選項來檢查第一次運行

這是我的代碼:

片段:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //Intent intent = new Intent(getActivity(), TutorialFeaturedActivity.class); 
    //startActivity(intent); 

    SharedPreferences settings = this.getActivity().getSharedPreferences(PREFS_NAME, 0); // Get preferences file (0 = no option flags set) 
    boolean firstRun = settings.getBoolean("firstRun", true); // Is it first run? If not specified, use "true" 

    if(firstRun) { 
     Log.w("onCreate: ","first time"); 
     Intent intent = new Intent(getActivity(), TutorialFeaturedActivity.class); 
     startActivity(intent); 

     SharedPreferences.Editor editor = settings.edit(); // Open the editor for our settings 
     editor.putBoolean("firstRun", false); // It is no longer the first run 
     editor.apply(); // Save all changed settings 
    } else { 
     Log.w("onCreate: ","second time"); 
     Intent intent = new Intent(getActivity(), MainActivity.class); 
     startActivity(intent); 
    } 

    getSpecials(); 
} 

但它是所有啓動的活動,當我再次啓動它,它凍結在一個白色的屏幕,但檢查記錄,它顯示像其他聲明不斷地反覆運行。我對Android很陌生,所以一些幫助或建議將不勝感激

+0

你應該使用editor.commit();保存更改 – gaurang

+0

請問使用getActivity()。finish()是什麼?這就是我看到的第一次和第二次運行之間的差異。這可能會讓你回到你檢查第一次跑步的班級,並且你進入了一個無限循環?! – Nico

+0

當我使用editor.commit();或申請我仍然得到相同的結果,也ide告訴我我shoudl使用應用而不是承諾,但同樣的問題。 – thaabitv

回答

0

試試這個辦法:

public class MainActivity extends Activity { 

    SharedPreferences prefs = null; 

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

     prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     if (prefs.getBoolean("firstRun", true)) { 
      Intent intent = new Intent(MainActivity.this, TutorialFeaturedActivity.class); 
      startActivity(intent); 
      prefs.edit().putBoolean("firstRun", false).commit(); 
     } 
     else 
     { 
      //do nothing 
     } 

     getSpecials(); 
    } 
} 
+0

這工作完美謝謝但是,當它添加在下一個活動,我顯示一個tut屏幕它不工作相同,無論如何,它在多個活動工作相同? – thaabitv

1

它看起來像你的活動循環,因爲在你的else語句中,你告訴它重新開始在else語句中再次登陸的活動,等等等等。

+0

我同意..類似這樣的事情正在發生 - SharedPreferences不是問題。如果OP代碼中的片段連接到MainActivity,這將是有意義的。 –

0

嘗試使用editor.commit如果editor.apply不工作

editor.putBoolean("firstRun", false); 
editor.apply(); // Save all changed settings 
editor.commit(); // Save all changed settings 
+0

如上述評論所述,除了異步性之外,這兩者之間沒有區別。 OP還表示,改變並沒有解決問題。 – Nico

+0

我知道沒有區別B/W適用和承諾 – Pehlaj

+0

我認爲「沒有區別」是誤導。編輯。commit()在editor.apply()保存在後臺時立即保存更改。 –

0

在其他情況下,你的起點 「MainActivity.class」。 爲什麼從MainActivity的oncreate中加載MainActivity? 它會形成一個循環。

從其他案例中刪除開始活動。

0
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    SharedPreferences pref = YourActivityName.this.getSharedPreferences(PREFS_NAME,0); 
    SharedPreferences.Editor editor= pref.edit(); 
    boolean firstRun = pref.getBoolean("firstRun", true); 
    if(firstRun) 
    { 
     Log.i("onCreate: ","first time"); 
     editor.putBoolean("firstRun",false); 
     editor.commit(); 
     Intent intent = new Intent(getActivity(), TutorialFeaturedActivity.class); 
     startActivity(intent); 
    } 
    else 
    { 
     Log.i("onCreate: ","second time"); 
     Intent intent = new Intent(getActivity(), MainActivity.class); 
     startActivity(intent); 

    } 
    // getSpecials(); 
} 
0

請儘量將我的朋友

public class SessionManager { 

private static String TAG = SessionManager.class.getSimpleName(); 

SharedPreferences pref; 
SharedPreferences.Editor editor; 
Context _context; 

// Shared pref mode 
int PRIVATE_MODE = 0; 

// Shared preferences file name 
private static final String PREF_NAME = "ManageRun"; 

private static final String KEY_IS_RUN = "isRun"; 


public SessionManager(Context context) { 
    this._context = context; 
    pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE); 
    editor = pref.edit(); 
} 

public void setLatest(boolean isRun) { 

    editor.putBoolean(KEY_IS_RUN, isRun); 
    // commit changes 
    editor.commit(); 
    Log.d(TAG, "Manage Version session modified!"); 
} 

public boolean isLatest() { 
    return pref.getBoolean(KEY_IS_RUN, true); 
} 
} 

**在第一個活動檢查**

private SessionManager session; 


session = new SessionManager(getApplicationContext()); 

if (session.isLatest()) { 
    session.setLatest(false); 
    Log.w("onCreate: ","first time"); 
    Intent intent = new Intent(getActivity(), TutorialFeaturedActivity.class); 
    startActivity(intent); 
} 
else 
{ 
    Log.w("onCreate: ","second time"); 
    Intent intent = new Intent(getActivity(), MainActivity.class); 
    startActivity(intent); 
} 
+0

這可以在多個活動中完成嗎? @Ratilal – thaabitv

+0

多個活動的意思是? –

+0

我想即時通訊代碼與試圖在另一個活動中使用代碼的代碼問題,但因爲首選項正在保存在一個活動的第一次運行它不顯示在下一個。 – thaabitv

0
private boolean isFirstTime() { 
     if (firstTime == null) { 
      SharedPreferences mPreferences = this.getSharedPreferences("first_time", Context.MODE_PRIVATE); 
      firstTime = mPreferences.getBoolean("firstTime", true); 
      if (firstTime) { 
       SharedPreferences.Editor editor = mPreferences.edit(); 
       editor.putBoolean("firstTime", false); 
       editor.commit(); 
      } 
     } 
     return firstTime; 
    } 



if (isFirstTime()) { 

        Intent i = new Intent(SplashActivity.this, Intro_slider.class); 
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(i); 
        finish(); 

       } else { 
        final UserFunctions uf = new UserFunctions(); 
        if (uf.isUserLoggedIn(SplashActivity.this)) { 
         Intent i = new Intent(SplashActivity.this, MainActivity.class); 
         i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         startActivity(i); 
         finish(); 
        } else { 
         Intent i = new Intent(SplashActivity.this, Social_Login_Activity.class); 
         i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         startActivity(i); 
         finish(); 
        } 
       } 

試試這個代碼。