2016-08-02 3 views
0

У меня есть 4 вида деятельности: MainActivity, p1, p2, p3.SharedPreferences не работает при повторном приложении

Мое приложение прекрасно работает, но проблема заключается в том, что когда приложение принудительно останавливается или запускает приложение на домашней кнопке, чтобы закрыть, а когда приложение открыто снова, кажется, что общая производительность очищается.

Я использую editor.apply(), но все еще не работает.

MainActivity:

public class MainActivity extends Activity { 


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



     final Button resume = (Button) findViewById(R.id.resume); 
     Button next = (Button) findViewById(R.id.next); 
     Button exit = (Button) findViewById(R.id.exit); 


     resume.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 


       final String PREFS_NAME = "MyPrefsFile"; 

       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 

       if (settings.getBoolean("my_first_time", true)) { 

        resume.setEnabled(false); 

        Log.d("Comments", "First time"); 


        settings.edit().putBoolean("my_first_time", false).commit(); 
       }else 
       { 

        MainActivity.this.finish(); 

       } 
      } 
     }); 

     next.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(MainActivity.this, p1.class); 
       startActivity(intent); 
      } 
     }); 

     exit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Intent intent = new Intent(Intent.ACTION_MAIN); 
       intent.addCategory(Intent.CATEGORY_HOME); 
       intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       startActivity(intent); 
      } 
     }); 
    } 
    } 

Xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <Button 
     android:text="resume" 
     android:layout_width="wrap_content" 
     android:id="@+id/resume" 
     android:layout_height="wrap_content" /> 

    <Button 
     android:text="next" 
     android:id="@+id/next" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <Button 
     android:id="@+id/exit" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="exit"/> 
</LinearLayout> 

P1:

public class p1 extends Activity { 

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

     Button next = (Button) findViewById(R.id.next); 
     Button home=(Button)findViewById(R.id.home); 

     next.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Intent intent = new Intent(p1.this, p2.class); 
       startActivity(intent); 

      } 
     }); 

     home.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 


       Intent intent = new Intent(p1.this, MainActivity.class); 
       startActivity(intent); 

      } 
     }); 

} 
    private void storeCurrentActivity(){ 
     SharedPreferences myPref =getSharedPreferences("APP_SHARED_PREF", Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor=myPref.edit(); 
     editor.putString("lastactivity", p1.this.getClass().getSimpleName()); 
     editor.commit(); 

    } 
    @Override 
    public void onResume(){ 
     super.onResume(); 
     storeCurrentActivity(); 
    } 

} 

XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <Button 
     android:text="next" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/next"/> 
<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="page 1"/> 
    <Button 
     android:text="go in main" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/home"/> 

</LinearLayout> 

и p2, p3, как p1.

+0

Вы используете Android 4.2? – Shaishav

+0

Что значит «не работает»? – Kelevandos

+0

мой андроид 4.4.2 – erfan

ответ

0

Вы просто сохранить эти значения Sharedpreference в OnPause() метод :)

Android Shared preferences example

Update:

Я обычно создаю Preferences класс (Singleton шаблон), который предоставляет методы получения и чтобы быстро считывать и сохранять значения в SharedPreferences. Я вставляю один и тот же экземпляр Preferences в любом месте кода, используя Dagger as Injector Dependency Injector.

Почему мы должны использовать одноплодный шаблон: Why use a singleton instead of static methods?

Я дам вам пример класса предпочтений:

public class Preferences { 

    private SharedPreferences sharedPreferences; 
    private final String NOTIFICATIONS_ENABLED = "NOTIFICATIONS_ENABLED"; 

    @Inject 
    public Preferences(Context context) { 
     sharedPreferences = context.getSharedPreferences("Preferences", 0); 
    } 

    public void setNotificationsEnabled(boolean enabled){ 
     SharedPreferences.Editor edit = sharedPreferences.edit(); 
     edit.putBoolean(NOTIFICATIONS_ENABLED, enabled); 
     edit.commit();   
    } 

    public boolean isNotificationsEnabled(){ 
     return sharedPreferences.getBoolean(NOTIFICATIONS_ENABLED, true); 
    } 
} 

и использовать его в любом месте вы хотите:

public class MainActivity extends Activity { 

    @Inject 
    NavigationController navigationController; 

    @Inject 
    Preferences preferences; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     SharedObjectGraph.getObjectGraph().inject(this); 

     if(preferences.isNotificationsEnabled()){ 
      // do something 
     } 
    } 
+1

так что я должен делать?если у вас есть подсказка, скажите мне точно – erfan

+0

@erfan Привет, Если вы хотите сохранить это значение даже при нажатии кнопки home, просто переопределите метод onPause() и метод storeCurrentActivity(). Это в основном о жизненном цикле активности android: https://developer.android.com/training/basics/activity-lifecycle/pausing.html – alway5dotcom

+1

привет, спасибо за помощь. Я новичок в андроиде, а мой английский - неделя, если вы хотите помочь. напишите коды и скажите мне, где должна помещаться тема: '( – erfan

0

вы положив 0 в качестве значения по умолчанию при установке sharedPreference и в случае, если проверка состояния является ложной ...

PREFS_NAME = "MyPrefsFile"; и

, если (settings.getBoolean ("my_first_time", правда))

имеют соответствующие различные условия. изменено имя sharedpreference

+0

так что ваша точка? объясните больше или напишите коды мне нужно – erfan

+0

Я думаю, вы понимаете меня плохо. я думаю, проблема в sharedPreference в p1 не Mainactivity – erfan