2013-04-30 2 views
0

У меня есть две службы (служба расширения DashClock, которая вызывает другую службу), а вторая служба должна сохранить значение, чтобы я мог использовать это значение для отображения в моем расширении DashClock. Однако это значение, похоже, не передается в службу расширения.getDefaultSharedPreferences, не сохраняющий между службами

DashClock Расширение:

@Override 
public void onCreate() { 
    super.onCreate(); 
    be=this; 
    //numUpdates = getSharedPreferences("PREFERENCE", MODE_PRIVATE).getInt("numUpdates", -1); 
    Intent i = new Intent(this, UpdateCheckService.class); 
    i.putExtra(Constants.CHECK_FOR_UPDATE, true); 
    startService(i); 
    //numUpdates = getSharedPreferences("PREFERENCE", MODE_PRIVATE).getInt("numUpdates", 0); 

    registerReceiver(myReceiver, new IntentFilter(Intent.ACTION_TIME_TICK)); 
} 

@Override 
protected void onUpdateData(int reason) { 
    // Get preference value. 
    final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    //String name = sp.getString(PREF_NAME, "Eric"); 
    Log.d("hiya","updating"); 
    /*while(getSharedPreferences("PREFERENCE", MODE_PRIVATE).getInt("numUpdates", -1)==-1){ 
     Log.d("wait","waiting here"); 
    }*/ 
    //numUpdates = getSharedPreferences("PREFERENCE", MODE_PRIVATE).getInt("numUpdates", -2); 
    int numUpdates = sp.getInt("numUpdates", -2); 
    Log.d("IMPORTANT FROM BrianExtension", "" + numUpdates); 
    Intent intent = new Intent(); 
    intent.setClassName("com.cyanogenmod.updater", "com.cyanogenmod.updater.UpdatesSettings"); 
    // Publish the extension data update. 
    if(numUpdates == 0){ 
     shouldShow = false; 
    } else{ 
     shouldShow = true; 
    } 
    publishUpdate(new ExtensionData() 
      .visible(shouldShow) 
      .icon(R.drawable.cid) 
      .status(numUpdates + " updates") 
      .expandedTitle(numUpdates + " Nightly CM Updates") 
      .expandedBody("Click here to go to CMUpdater.") 
      .clickIntent(intent)); 
} 

UpdateCheckService:

@Override 
public void onCreate() { 
    ucs = this; 
    registerReceiver(mReceiver, new IntentFilter("updatethis")); 
    /*prefs = getSharedPreferences("PREFERENCE", Context.MODE_PRIVATE); 
    prefs.registerOnSharedPreferenceChangeListener(mListener);*/ 
    final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    Thread thread = new Thread(new Runnable(){ 
     @Override 
     public void run() { 
      try { 
       try { 
        int ericUpdates = getAvailableUpdates().getUpdateCount(getBaseContext()); 
        Log.d("yes!", ""+ericUpdates); 
        sp.edit().putInt("numUpdates", ericUpdates).apply(); 
        Log.d("IMPORTANT FROM UpdateCheckService", "" + sp.getInt("numUpdates", -99)); 
        //getSharedPreferences("PREFERENCE", MODE_PRIVATE).edit().putInt("numUpdates", ericUpdates).apply(); 
        //Log.d("IMPORTANT FROM UpdateCheckService", "" + getSharedPreferences("PREFERENCE", MODE_PRIVATE).getInt("numUpdates", -99)); 
        sendBroadcast(new Intent(ucs, BrianUpdaterReceiver.class)); 
        //BrianExtension.be.onUpdateData(4); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
    thread.start(); 
    //stopSelf(); 
    // Get the System Mod string 
    mSystemMod = TESTING_DOWNLOAD ? "cmtestdevice" : SysUtils.getSystemProperty(Customization.BOARD); 
    if (mSystemMod == null) { 
      Log.i(TAG, "Unable to determine System's Mod version. Updater will show all available updates"); 
    } 
} 

Журналы показывают, что значение в "numUpdates" предпочтение правильно в UpdateCheckService, но остается -2 в BrianExtension.

манифеста записи:

<service android:name=".BrianExtension" 
     android:icon="@drawable/cid" 
     android:label="CyanogenMod Updates" 
     android:permission="com.google.android.apps.dashclock.permission.READ_EXTENSION_DATA"> 
     <intent-filter> 
      <action android:name="com.google.android.apps.dashclock.Extension" /> 
     </intent-filter> 
     <meta-data android:name="protocolVersion" android:value="1" /> 
     <meta-data android:name="description" 
      android:value="Displays Number of New Nightly Updates Available" /> 
    </service> 

<service android:name="com.brianco.cyanogenmodupdatecheckfordashclock.UpdateCheckService" 
      android:process="com.brianco.cyanogenmodupdatecheckfordashclock.UpdateCheckService"> 
     <intent-filter> 
      <action android:name="com.brianco.cyanogenmodupdatecheckfordashclock.IUpdateCheckService"/> 
     </intent-filter> 
    </service> 
+0

Публикация записей манифеста для двух элементов ''. – CommonsWare

+0

Вы работаете в разных процессах? –

+0

Я думаю, что они находятся в разных процессах. Это проблема? –

ответ

1

Во-первых, почему он сейчас работает?

Потому что вы использовали два отдельных процесса. SharedPreferences считываются изначально, а затем фактически записываются только для остальной части процесса. Для двух процессов, работающих одновременно, один процесс не может видеть изменения другого процесса.

Во-вторых, удалите эту линию, чтобы что-нибудь сломать?

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

+0

Большое спасибо! Это сводило меня с ума. –

Смежные вопросы