Java Android在首次运行时使用共享首选项进行检查

Java Android在首次运行时使用共享首选项进行检查,java,android,android-fragments,android-intent,android-sharedpreferences,Java,Android,Android Fragments,Android Intent,Android Sharedpreferences,嗨,我正在尝试检测我的应用程序是否已首次打开。如果有,我需要运行一个活动,一旦它第二次打开,它就不应该再显示它 这是我的代码: 片段: @覆盖 创建时的公共void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); //Intent Intent=new Intent(getActivity(),TutorialFeaturedActivity.class); //星触觉(意向); SharedReferences设置

嗨,我正在尝试检测我的应用程序是否已首次打开。如果有,我需要运行一个活动,一旦它第二次打开,它就不应该再显示它

这是我的代码:

片段:

@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//Intent Intent=new Intent(getActivity(),TutorialFeaturedActivity.class);
//星触觉(意向);
SharedReferences设置=this.getActivity().getSharedReferences(PREFS_NAME,0);//获取首选项文件(0=未设置选项标志)
boolean firstRun=settings.getBoolean(“firstRun”,true);//是第一次运行吗?如果未指定,请使用“true”
如果(首次运行){
w(“onCreate:,“first time”);
Intent Intent=new Intent(getActivity(),TutorialFeaturedActivity.class);
星触觉(意向);
SharedReferences.Editor Editor=settings.edit();//打开设置编辑器
editor.putBoolean(“firstRun”,false);//它不再是第一次运行
editor.apply();//保存所有更改的设置
}否则{
w(“onCreate:,“第二次”);
Intent Intent=新的Intent(getActivity(),MainActivity.class);
星触觉(意向);
}
getSpecials();
}

但它所做的只是启动活动,当我再次启动它时,它会冻结在一个白色屏幕上,但检查它显示的日志,就像else语句不断重复运行一样。我对Android相当陌生,因此非常感谢您提供一些帮助或建议

看起来您的活动正在循环,因为在else语句中,您告诉它重新启动活动,然后在else语句中再次登录,依此类推。

尝试使用
编辑器。提交
如果
编辑器。应用
不工作

editor.putBoolean("firstRun", false); 
editor.apply(); // Save all changed settings
editor.commit(); // Save all changed settings
尝试以下方法:

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();
    }
}

在其他情况下,启动“MainActivity.class”。 为什么要从一次创建MainActivity加载MainActivity? 它将形成一个循环


从else案例中删除启动活动。

请尝试此,我的朋友

@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();
}
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);
}

试试这个代码

您应该使用editor.commit();为了保存更改,我想问一下
getActivity().finish()
的用途是什么?这就是我看到的第一次和第二次跑步的区别。这可能会让你回到课堂,在那里你检查第一次跑步,然后进入一个无休止的循环?!当我使用editor.commit()时;或者应用我仍然得到相同的结果,ide也告诉我应该使用应用而不是提交,但问题相同。@Nico我使用getActivity().finish();为了结束正在运行的教程活动,我忘了在问题中将其取出,因为它仍然无法修复任何问题。请在此文件中发布所有代码。如上所述,除了异步性之外,这两者之间没有区别。OP还表示,更改并不能解决问题。我知道没有差异b/w应用,委员会认为“无差异”是误导。当editor.apply()在后台保存时,editor.commit()立即保存更改。但它执行相同的功能,对吗?这就是我想说的我同意。。类似的事情正在发生——共享引用不是问题所在。如果操作代码中的片段被附加到MainActivity,这将是有意义的。这非常有效,但当在下一个活动中添加它时,我会显示一个tut屏幕,它的工作方式不一样,无论如何,让它在多个活动中工作相同??多个活动的意思是?我想我的代码有问题,我试图在另一个活动中使用代码,但由于首选项在一个活动的第一次运行中保存,因此在下一次运行中不会显示。
    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();
                    }
                }