2010-12-01 65 views
0

我有一个简单的问题需要解决,但我不知道该怎么做。Android:调用从服务到活动的方法

我有一个类扩展了运行一个线程寻找TCP连接的服务。如果有人进来,它会读取输入消息。

如果输入的消息是“START”,我开始一个活动,以这种方式:

Intent dialogIntent = new Intent(getBaseContext(), VoIPCall.class); 
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
dialogIntent.putExtra("inetAddress", clientSocket.getInetAddress()); 
getApplication().startActivity(dialogIntent); 

虽然这个活动运行,服务保持运行。在某个时候,我可能会保留“停止”。我想在之前创建的Activity中调用一个方法,但我不确定如何与之交互。

我不想使用静态方法。我怎么能这样做?

非常感谢你,

编辑:我改变了我的代码如下:

Intent dialogIntent = new Intent("com.voip.rudy.START_CALL"); 
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
dialogIntent.putExtra("inetAddress", clientSocket.getInetAddress()); 
getApplication().startActivity(dialogIntent); 

而且在清单:

<activity android:name=".VoIPCall"> 
    <intent-filter> 
     <action android:name="com.voip.rudy.START_CALL" /> 
     <action android:name="com.voip.rudy.STOP_CALL" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</activity> 


<category android:name="android.intent.category.DEFAULT" /> was required to avoid having it crash. 

编辑:

解决方案给出已经解决了我的问题,但我想实际上在该类上的成员变量上行事,这些变量以前是ini tialized。说我调用构造函数,然后我想回到这个活动,并对成员变量行事。

当我调用一个接一个的动作时,成员变量不会被初始化,它似乎以某种方式创建一个新的活动。无论如何要采取相同的行动,并保持完好的物体吗?

James

+0

你最好的选择可能是发送广播。 – Falmarri 2010-12-01 23:21:19

回答

2

添加Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT标记您的意图,并通过一个新的动作或一个特殊的额外的可以识别意图的方式调用startActivity。使用

private void handleIntent(Intent intent) { 
} 

调用这个从的onCreate(或的onResume):

活动中,编写一个名为方法

handleIntent(getIntent()); 

,并写上:

@Override 
protected void onNewIntent(Intent intent) { 
    setIntent(intent); 
    handleIntent(intent); 
} 
0

有几种方法可以做到,实际上取决于应用程序的整体结构。一切都可以工作。 1)创建一个自定义的意图,并让它的活动或服务在它发送时作出反应 2)代替服务,设置逻辑对于作为对话活动内的异步任务的tcp连接,当你有tcp连接时,你可以将它传递给服务来完成它的工作 3)看看本地服务和远程服务SDK示例并使用回调代码作为将数据传递回活动的基础。您也可以通过界面回到服务。 4)甚至可能设置一个广播接收器'架构'。这具有将用户活动与服务完全分离的优点。您可以将某些应用程序逻辑放入另一个进程的服务中,甚至可以在设备启动时运行的进程中。

+0

非常感谢。非常感激。 – James 2010-12-02 07:05:36

+0

欢迎您。在SDK中有很多这些东西的例子,但是如果你需要的话,我可以抛出一个代码片段。 – 2010-12-02 17:24:15

0

我想任何技术都可以工作。我猜你所看到的行为与android中活动的生命周期有关,你可能需要将一些处理移动到onResume/onPause或onStart/onStop方法。如果您发现自己的活动onCreate没有被调用,但是现在您的活动处于活动状态,则可能仅仅是来自先前调用的活动实例在系统中仍处于活动状态。如果是这样,操作系统可能会使用它而不是您想要的新活动。查看这是否是问题的最好方法是在您覆盖的所有活动方法的开头和结尾放置一些“Log.d”调用。您将能够通过观看logcat来了解发生了什么。您使用的技术也可能取决于您希望活动对TCP事件的反应的同步程度。如果你想完全异步,你可以使用标准广播,或使用消息发送服务回调。如果你想同步,那么用服务回调来完成。如果你还没有看到这个SDK链接有一个很好的活动生命周期描述http://developer.android.com/reference/android/app/Activity.html