Android:调用从服务到活动的方法

时间:2010-12-01 23:19:19

标签: android service android-activity

我有一个简单的问题要解决,但我不知道该怎么做。

我有一个扩展Service的类,它运行一个寻找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.

编辑:

给出的解决方案解决了我的问题,但我想实际对该类上的成员变量进行操作,这些变量先前已初始化。假设我调用构造函数,然后我想回到此活动并对成员变量进行操作。

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

詹姆斯

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

有几种方法可以做到,实际上取决于应用程序的整体结构。一切都可以。在我的头脑中,这些是想到的方法

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

答案 2 :(得分:0)

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

有很好的描述