从Service类调用活动类方法

我已经看到很多关于这方面的文章,但不能从服务类中获得确切和最简单的方法来调用一个活动方法。 广播接收机只有选项吗? 没有捷径 ? 媒体播放器在Service类中准备好之后,我只需在Activity类中调用以下方法即可。

活动课:

public void updateProgress() { // set Progress bar values songProgressBar.setProgress(0); songProgressBar.setMax(100); // Updating progress bar updateProgressBar(); } 

服务等级:

  @Override public IBinder onBind(Intent intent) { Log.d(this.getClass().getName(), "BIND"); return musicBind; } @Override public boolean onUnbind(Intent intent) { return false; } @Override public void onPrepared(MediaPlayer mp) { try { mp.start(); } catch (IllegalStateException e) { e.printStackTrace(); } // updateProgress();// Need to call the Activity method here } 

Solutions Collecting From Web of "从Service类调用活动类方法"

定义您的服务将用于沟通事件的界面:

 public interface ServiceCallbacks { void doSomething(); } 

写下你的服务类。 您的活动将绑定到此服务,所以请按照此处显示的示例进行操作 。 另外,我们将添加一个方法来设置ServiceCallbacks

 public class MyService extends Service { // Binder given to clients private final IBinder binder = new LocalBinder(); // Registered callbacks private ServiceCallbacks serviceCallbacks; // Class used for the client Binder. public class LocalBinder extends Binder { MyService getService() { // Return this instance of MyService so clients can call public methods return MyService.this; } } @Override public IBinder onBind(Intent intent) { return binder; } public void setCallbacks(ServiceCallbacks callbacks) { serviceCallbacks = callbacks; } } 

按照相同的指南编写您的Activity类,但也要实现您的ServiceCallbacks接口。 从服务绑定/解除绑定时,您将通过调用服务上的setCallbacks来注册/取消注册。

 public class MyActivity extends Activity implements ServiceCallbacks { private MyService myService; private boolean bound = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(...); } @Override protected void onStart() { super.onStart(); // bind to Service Intent intent = new Intent(this, MyService.class); bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); // Unbind from service if (bound) { myService.setCallbacks(null); // unregister unbindService(serviceConnection); bound = false; } } /** Callbacks for service binding, passed to bindService() */ private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { // cast the IBinder and get MyService instance LocalBinder binder = (LocalBinder) service; myService = binder.getService(); bound = true; myService.setCallbacks(MyActivity.this); // register } @Override public void onServiceDisconnected(ComponentName arg0) { bound = false; } }; /* Defined by ServiceCallbacks interface */ @Override public void doSomething() { ... } } 

现在,当您的服务想要与活动进行通信时,只需调用以前的某个接口方法即可。 在您的服务中:

 if (serviceCallbacks != null) { serviceCallbacks.doSomething(); } 

使用带有服务的广播接收器来更新服务类中的视图。 例如:

  1. 在我的活动课上

     public class ServiceDemoActivity extends Activity { Intent intent; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final TextView notification = (TextView) findViewById(R.id.notification); if (CheckIfServiceIsRunning()) { } else { startService(new Intent(this, MyService.class)); } } private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { updateDate(intent); } }; private void updateDate(Intent intent) { String time = intent.getStringExtra("time"); Toast.makeText(getApplicationContext(), "Yea!!! Service called", Toast.LENGTH_SHORT).show(); TextView date = (TextView) findViewById(R.id.date); date.setText(time); } @Override public void onResume() { super.onResume(); registerReceiver(broadcastReceiver, new IntentFilter( MyService.BROADCAST_ACTION)); } } 

    而在我的服务课,我更新我的用户界面几个时间间隔后,我打电话给我的更新ui。

     public class MyService extends Service { public static final String BROADCAST_ACTION = "com.mukesh.service"; private final Handler handler = new Handler(); @Override public void onCreate() { intent = new Intent(BROADCAST_ACTION); } @Override public void onDestroy() { stopService(intent); } @Override public void onStart(Intent intent, int startid) { int i = 0; while (i <= 2) { if (i > 1) { i++; this.onDestroy(); } else { counter = i; i++; handler.removeCallbacks(sendUpdatesToUI); handler.postDelayed(sendUpdatesToUI, 1 * 1000); // 1 sec } } } private Runnable sendUpdatesToUI = new Runnable() { public void run() { DisplayLoggingInfo(); handler.postDelayed(this, 7 * 1000); // 7 sec } }; private void DisplayLoggingInfo() { intent.putExtra("time", new Date().toLocaleString()); intent.putExtra("counter", String.valueOf(counter)); sendBroadcast(intent); stopService(intent); } } 

为了完整的代码检查这个链接

我创build了一个名为Delegate的通用类(它不是一个特殊名称,可以将其命名为John),并将MainActivity类作为静态字段传递给它。 那么我现在就可以从服务中获得它的服务。 我不确定它是否具有成本效益,但它为我解决了简单的问题。

我的服务:

 package com.some.package; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.FirebaseInstanceIdService; public class FirebaseInstanceIDService extends FirebaseInstanceIdService { @Override public void onTokenRefresh() { String token = FirebaseInstanceId.getInstance().getToken(); Delegate.theMainActivity.onDeviceTokenChange(token); } } 

代表class级:

 package com.some.package; public class Delegate { static MainActivity theMainActivity; } 

我在MainActivity上做了什么:

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Delegate.theMainActivity = this; //rest of the code... } public void onDeviceTokenChange(String token){ Log.e("updated token:", token); } 

您不能直接从您的活动中调用您的服务方法,反之亦然。 与服务交stream有三种方式; 使用广播和接收器,使用Messenger或绑定到服务。 有关更多信息,请参阅http://developer.android.com/guide/components/bound-services.html

你可以打电话从你的服务

  getContentResolver().notifyChange(uri, null); 

并在你的活动中,你设立了一个

 getContentResolver().registerContentObserver(uri, false, new ContentObserver(getHandler()) { public void onChange(boolean selfChange) { updateProgress() } }; 

onChange方法将在UI线程上调用