2016-08-11 3 views
0

У меня есть Android активность называется Main, который вызывает службу под названием MainService следующим образом:Доступ к переменной услуге

Intent intent = new Intent(this, MainService.class); 
if(MainService.getInstance() == null){ 
    Log.d(TAG, "Calling MainService"); 
    startService(intent); 
} 

MainService поддерживает переменный во время своей жизни, что я хочу, чтобы получить доступ в Main позже. Как мне это сделать?

Спасибо.

+0

Почему вы не используете функцию связывания для связи между активностью и сервисом? Я думаю, что это даст вам больше гибкости для обмена данными. –

ответ

0

Да, вы можете получить доступ к переменным внутри службы, но для этого вам нужно сначала привязать эту службу. После этого используйте accessors для получения или установки переменных или вызова любого другого метода службы. См. https://developer.android.com/guide/components/bound-services.html

+0

Спасибо. Я внесла некоторые изменения в код, а именно bindService() в onCreate, а не onStart(), и никогда не отключал службу, так как я хочу, чтобы служба выполнялась неограниченное время. Он работает, за исключением того, что я продолжаю получать сообщение об ошибке «Activity hasconnected ServiceConnection» в моем вызове bindService(). Кроме того, каждый раз, когда я возвращаюсь к своей работе, ServiceConnection, похоже, снова вызывается. Это должно быть 1 раз, не так ли? Связано ли это с использованием bindService(), а не с startService()? – user1118764

+0

ОК, поэтому я понял, что службы, связанные с действиями, оживают только тогда, когда активность активна, т. Е. Она следует за жизненным циклом деятельности. Таким образом, я начал службу из активности с помощью startService(), а затем связал службу с активностью, и это работает сейчас. – user1118764

2

Вы можете связать службу и иметь экземпляр службы навсегда. Ниже пример кода поможет вам: -
Класс обслуживания

public class MusicService extends Service { 

    MyBinder binder=new MyBinder(); 
    MusicService services; 
    static Context context; 
    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return binder; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     context=getApplicationContext(); 

     MediaPlayer mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.yaar); 
     mPlayer.start(); 
    } 

    public class MyBinder extends Binder 
    { 
     public MusicService getServiceSystem() 
     { 
      return MusicService.this; 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 
} 

активность

public class MainActivity extends AppCompatActivity { 

    MusicService services; 

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

     ServiceConnection connection=new ServiceConnection() { 
      @Override 
      public void onServiceConnected(ComponentName name, IBinder service) { 
       MusicService.MyBinder binderr=(MusicService.MyBinder)service; 
       services=binderr.getServiceSystem(); 
      } 

      @Override 
      public void onServiceDisconnected(ComponentName name) { 

      } 
     }; 

     Intent intent= new Intent(this, MusicService.class); 
     startService(intent); 
    } 

} 

Вы можете использовать service где вам нужно в деятельности. Надеюсь, поможет.

+0

Спасибо. Я пробовал это, но похоже, что onServiceConnected() никогда не вызывается? Следовательно, службы являются нулевыми и непригодными для использования. – user1118764

+0

@ user1118764 убедитесь, что вы объявили в манифесте? –