2016-10-14 59 views
0

我有一个函数在服务如下:我可以从Android的其他服务调用服务的功能吗?

public class ServiceA extends Service { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.d(TAG, "onCreate"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     return START_NOT_STICKY; 
    } 

    private final IBinder mBinder = new LocalBinder(); 

    public void readFunc() { 
     //I have a function in here 
    } 
} 

我想打电话给readFunc()service B。我可以在Android中执行吗?谢谢大家。这是我的service B

public class serviceB extends Service { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.d(TAG, "onCreate"); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction("A"); 
     intentFilter.addAction("B"); 
     registerReceiver(broadcastReceiver, intentFilter); 
     return START_STICKY; 
    } 

    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      switch (intent.getAction()) { 
       case "A": 
        Log.d(TAG,"A"); 
        //Call the function here 
        break; 
       case "B": 
        Log.d(TAG,"B"); 
        break; 
      } 
     } 
    }; 

} 

回答

0

嗯,你能做到这一点,只是实例化一个新的ServiceA和调用功能,但你不应该那样做。服务并不意味着为了调用一个甚至不是服务功能的一部分的函数而实例化。您有不同的选项:

  • 如果不修改该类的变量并且您认为它应该属于ServiceA而不属于ServiceB,则可以使readFunc()为static。我认为这不是你的情况。
  • 您可以创建一个具有readFunc()的类ServiceAB,并将ServiceA和B定义为“extends ServiceAB”。然后这两个类都会继承这个函数,你可以在它们中调用readFunc()。我认为这将是您的案例中的正确方法:这两个类都需要一些通用功能。
  • 您可以在不同的类中使用readFunc(),并将其实例化为在每个服务中使用它。

的方式我会做:

public class ServiceAB extends Service { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.d(TAG, "onCreate"); 
    } 

    public void readFunc() { 
     //I have a function in here 
    } 
} 

然后:

public class serviceB extends ServiceAB { 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction("A"); 
     intentFilter.addAction("B"); 
     registerReceiver(broadcastReceiver, intentFilter); 
     return START_STICKY; 
    } 

    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      switch (intent.getAction()) { 
       case "A": 
        Log.d(TAG,"A"); 
        readFunc(); //Just call the function 
        break; 
       case "B": 
        Log.d(TAG,"B"); 
        break; 
      } 
     } 
    }; 

} 

而且ServiceA:

public class ServiceA extends ServiceAB { 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     return START_NOT_STICKY; 
    } 

    private final IBinder mBinder = new LocalBinder(); 

} 
0

报价@Kingfisher福here和@Mr雪花here

有提供服务与EventBus沟通三个明显的途径:

  • 使用意图
  • 使用AIDL
  • 使用服务对象本身(如单身)
  • EventBus

    在你的情况下,我会选择3.选择一个静态的服务它自己并将其填充到onCreate()中:

    void onCreate(Intent i){ sInstance = this; }

使静态函数为MyService的getInstance(),它返回静态sInstance。

然后在Activity.onCreate()启动服务, 异步等到服务实际启动(你可以有你的服务通知你的应用程序是通过发送一个Intent的活动做好准备。),并得到它的实例。

当你有实例,注册服务监听对象为您服务,您的设置。

注:编辑活动中浏览时,你应该修改它们在UI线程,该服务可能会运行自己的主题,所以你需要调用Activity.runOnUiThread()。

你需要做的最后一件事就是删除提及您监听对象Activity.onPause(),否则你的活动范围内的实例会泄漏,也不好。

注意:此方法仅在您的应用程序/活动/任务是仅用于访问您的服务的过程时有用。如果不是这种情况下,你必须使用选项1或2

+0

@ user3051460你能解决问题了吗?我相信这个答案应该被标记为正确,让我知道这是否有助于=) – HenriqueMS

相关问题