2012-07-18 89 views
1

为了将数据传回从服务活动,我来了解ResultReceiver广播/本地广播绑定服务。然而,我对这种方法感到困惑:如果我们简单地称活动静态公共函数来传递回来,这种方法的优缺点是什么。说我有活动:将数据传回活动从服务

public interface ListenerInterface { 

    void DataExchange(String data); 


} 
public class MainActivity extends Activity implements ListenerInterface{ 

    private static MainActivity instance; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     instance=this; 

     Intent i=new Intent(); 
     i.setClass(this, MyService.class); 
     startService(i); 
    } 

    public static MainActivity getInstance(){ 
     if(instance!=null) 
      return instance; 

     return null; 
    } 

    @Override 
public void DataExchange(String data) { 
    // TODO Auto-generated method stub 
    Log.d("sohail","data received="+data); 
} 

} 

和IntentService:

public class MyService extends IntentService{ 

    MainActivity obj; 
    public MyService() { 
     super("MyService"); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    protected void onHandleIntent(Intent arg0) { 
     // TODO Auto-generated method stub 

     MainActivity.getInstance().DataExchange("Service Data"); 
    } 

} 
+1

永远不会在其他应用程序组件中的“Activity”中创建公共/静态方法或成员变量 - 它不会工作,也不是它的工作原理。请阅读http://developer.android.com/guide/components/fundamentals.html“活动”是一种“特殊情况”课程,旨在是独立的。尽量使用'ResultReceiver',绑定到'Service'或者使用'BroadcastReceiver',但不要假设你可以访问'Activity'的公共/静态成员。 – Squonk 2012-07-18 08:15:37

+0

'私有静态MainActivity实例;'这将导致您的应用程序内存泄漏 – waqaslam 2012-07-18 08:41:58

+0

谢谢大家,我使用了上面讨论的所有方法,但在知道这种方法在非常有名的VoIP应用[linphone](http:// www。 linphone.org)。现在很清楚。 – SohailAziz 2012-07-18 09:44:20

回答

2

缺点:

  • 可以有一个活动的多个实例,你的方法只能创建的最后会得到一个结果。
  • 交付结果时,它可能会或可能不可见/可用。
  • 您的服务将直接取决于您的用户界面(活动)。

更好的方法是让该活动实现一些接口(如DataHandler),而不是将其直接耦合到服务。此外,为了确保只有在您可以对其执行操作时才会收到数据,请将该活动注册为处理程序onStart()并取消注册onStop()

+0

请看编辑的问题。没有优点? – SohailAziz 2012-07-18 08:09:52

+1

'getInstance()'上的活动根本不会飞:)生命周期由平台管理,因此您必须运行该应用程序,否则您的应用程序将崩溃并烧毁。你为什么坚持这样做? – 2012-07-18 08:21:31

+0

感谢您的快速解答Elenkov,我正在使用上面讨论的所有方法,但在知道了这种非常着名的VoIP应用[linphone](http://www.linphone.org/eng/download/packages/)方法后感到困惑。 – SohailAziz 2012-07-18 09:37:27

相关问题