Я хочу изменить код в действии от службы как я могу это сделать. я хочу, чтобы поместить этот кодКак изменить код в действии со службы?
button1.setBackgroundResource(R.drawable.play);
в моем коде сервиса и изменить его в своей деятельности
Я хочу изменить код в действии от службы как я могу это сделать. я хочу, чтобы поместить этот кодКак изменить код в действии со службы?
button1.setBackgroundResource(R.drawable.play);
в моем коде сервиса и изменить его в своей деятельности
Решение было бы использовать:
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);
Android на самом деле binders для связи с деятельностью к Сервису, но ничего не сделано по-другому.
Если вы хотите связаться со Службой для деятельности, я бы предложил использовать EventBus. Это принцип автобуса событий, где Служба может размещать на автобусе, и деятельность может слушать и действовать на события.
Вы должны использовать 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();
}
Еще одна вещь. Лучше всего зарегистрировать приемники в onResume и отменить регистрацию в onPause – Toochka
НЕТ! Это неправильно ... В этом случае вы можете делать что-либо с вашей деятельностью из любого места в коде. Если вам нужно что-то подобное, и вы не хотите создавать BroadcastReceivers, вы можете использовать интерфейсы, но для этого вам нужно будет подумать о действительно хорошем подходе – Toochka
Я не сказал, что это идеальное решение. Это просто рабочий. Лучшим способом было бы использовать 'binders' (http://stackoverflow.com/questions/17513717/update-service-running-on-background) – Manitoba