0

私は活動とサービスを持っています。サービスで時々更新されているサービス整数への参照を取得したいと思います。私の問題は、アクティビティで、最初に宣言された値 (たとえば 0) の整数のみを取得することです。

私の主な目標は、プログラムを開始するたびにサービスの更新された価値を知ることです。

主な活動:

if(Service.doesCounter>0){
                        //do something
                //in this state Service.doesCounter always is 0(checked by log)
        }

サービス:

public static int doesCounter=0; // declared after class as class memeber
//code where I start my method does();

.....
public void does(){
        doesCounter++;
        Log.e("cccccc","Service Counter "+doesCounter); // everything ok, value is changing as suppose to.
}

編集

私の共有設定クラス:

public class AppPreferences extends PreferenceActivity {
      @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }

    private static final String APP_SHARED_PREFS = "com.aydabtu.BroadcastSMS_preferences"; //  Name of the file -.xml
         private SharedPreferences appSharedPrefs;
         private Editor prefsEditor;

         public AppPreferences(Context context)
         {
             this.appSharedPrefs = context.getSharedPreferences(APP_SHARED_PREFS, Activity.MODE_PRIVATE);
             this.prefsEditor = appSharedPrefs.edit();
         }

         public boolean getAnything() {
             return appSharedPrefs.getBoolean("Anything", false);

         }

         public void setAnything(Boolean text) {
             prefsEditor.putBoolean("Anything", text);
             prefsEditor.commit();
         }

次に、メイン アクティビティから:

public class MainActivity extends Activity {
    protected AppPreferences appPrefs;
appPrefs = new AppPreferences(getApplicationContext());
appPrefs.setAnything(fasle);

次にサービスから:

appPrefs = new AppPreferences(getApplicationContext());

これが発生すると、以前に行ったすべての変更がリセットされます。サービスと MainActivity で同じ設定を使用するにはどうすればよいですか? どうにかして AppPrefs クラスを静的にすることができますか?

4

1 に答える 1

1

Android では、静的クラス フィールドを使用することは悪い習慣と見なされます。アプリのリソースが OS によって取り消される可能性があり、ユーザーがアプリに戻るたびに、アプリの別のプロセスが再初期化される可能性があります。この場合、dosCounter の更新が失われます。これが事実であるかどうかはわかりません(別のプロセスでサービスを実行していない限り(フラグisolatedProcessを使用して)、アプリがフォアグラウンドである一般的なシナリオで動作するはずです)。

「アンドロイドのやり方」でやろうとしていることを達成する最も簡単な方法は、dosCounter を SharedPreferences に保存することです。

それを達成する 1 つの方法は、次のような静的クラスを持つことです。

public class PrefUtils {
private final static String NUM_DOES = "NumDoes";

public static int getNumDoes(Context c)
{
    int mode = Activity.MODE_PRIVATE;
    SharedPreferences mySharedPreferences = c.getSharedPreferences(PREF_NAME, mode);        
    return mySharedPreferences.getInt(NUM_DOES, 0);
}


public static void setNumDoes(int numDoes , Context c)
{
    int mode = Activity.MODE_PRIVATE;
    SharedPreferences mySharedPreferences = c.getSharedPreferences(PREF_NAME, mode);        
    SharedPreferences.Editor editor = mySharedPreferences.edit();   
    editor.putInt(NUM_DOES, numDoes);
    editor.commit();

}

これで完了です。PrefUtils.getNumDoes / setNumDoes を呼び出すだけです

于 2013-03-17T14:03:59.600 に答える