2014-09-17 2 views

ответ

0

Решение было бы использовать:

public class DummyActivity extends Activity 
{ 
    public static DummyActivity instance = null; 
    public Button btn = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     btn = (Button) findViewById(R.id.btn); 

     // Do some operations here 
    } 

    @Override 
    public void onResume() 
    { 
     super.onResume(); 
     instance = this; 
    } 

    @Override 
    public void onPause() 
    { 
     super.onPause(); 
     instance = null; 
    } 
} 

Тогда в вашей службе, используйте

if (DummyActivity.instance != null) DummyActivity.instance.btn.setBackgroundResource(R.drawable.play); 
+1

НЕТ! Это неправильно ... В этом случае вы можете делать что-либо с вашей деятельностью из любого места в коде. Если вам нужно что-то подобное, и вы не хотите создавать BroadcastReceivers, вы можете использовать интерфейсы, но для этого вам нужно будет подумать о действительно хорошем подходе – Toochka

+0

Я не сказал, что это идеальное решение. Это просто рабочий. Лучшим способом было бы использовать 'binders' (http://stackoverflow.com/questions/17513717/update-service-running-on-background) – Manitoba

0

Android на самом деле binders для связи с деятельностью к Сервису, но ничего не сделано по-другому.

Если вы хотите связаться со Службой для деятельности, я бы предложил использовать EventBus. Это принцип автобуса событий, где Служба может размещать на автобусе, и деятельность может слушать и действовать на события.

1

Вы должны использовать LocalBroadcastManager для отправки Intent из своей службы в свою деятельность.

Intent intent = new Intent("changeButtonColorEvent"); 
LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 

Затем в деятельности, необходимо зарегистрировать приемник и реагировать на получение вышеуказанного Intent

@Override 
public void onResume(Bundle savedInstanceState) { 

... 

// Register to receive messages. 
LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, 
    new IntentFilter("changeButtonColorEvent")); 
} 

// Our handler for received Intents. 
private BroadcastReceiver mReceiver = new BroadcastReceiver() { 
@Override 
public void onReceive(Context context, Intent intent) { 
    button1.setBackgroundResource(R.drawable.play); 
} 
}; 

@Override 
protected void onPause() { 
// Unregister since the activity is about to be closed. 
LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver); 
super.onDestroy(); 
} 
+1

Еще одна вещь. Лучше всего зарегистрировать приемники в onResume и отменить регистрацию в onPause – Toochka

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