我的方案是:我有两个应用程序Main和WSCaller。
我可以创建这样的WSCaller应用程序吗?
我尝试创建一个简单的如下。
的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ch.tpg.syscontrolws.mobile">
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<receiver android:name=".activities.ServiceStarter">
<intent-filter>
<action android:name="mypackage.CALL_WS" />
</intent-filter>
</receiver>
</application>
</manifest>
ServiceStarter.java
public class ServiceStarter extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("ServiceStarter", intent.getAction());
// Do not know yet how to return data to Main?
}
}
在Main,我做了:
Intent intent = new Intent("mypackage.CALL_WS");
sendBroadcast(intent);
但是WSCaller没有启动并收到消息。
我怎样才能让它发挥作用?
谢谢。
答案 0 :(得分:2)
所有Android应用都需要启动活动。所以你需要有一些占位符UI。您还需要在清单中声明服务。
像这样:
<service android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:isolatedProcess=["true" | "false"]
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
. . .
来源:http://developer.android.com/guide/topics/manifest/service-element.html
答案 1 :(得分:1)
我认为问题在于,它是一个单独的应用程序。这就是为什么它遵循自己的配置。
在Android 3.1及更高版本上,用户必须在任何清单注册的BroadcastReceiver工作之前启动您的一项活动。 另一种启动方式是。
private void launchComponent(String packageName, String name)
{
Intent launch_intent = new Intent("android.intent.action.MAIN");
launch_intent.addCategory("android.intent.category.LAUNCHER");
launch_intent.setComponent(new ComponentName(packageName, name));
launch_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startService(launch_intent);
}
public void startApplication(String application_name)
{
try{
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
// intent.setAction(Intent.)
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
List<ResolveInfo> resolveinfo_list = this.getPackageManager().queryIntentActivities(intent, 0);
for(ResolveInfo info:resolveinfo_list)
{
if(info.activityInfo.packageName.equalsIgnoreCase(application_name))
{
launchComponent(info.activityInfo.packageName, info.activityInfo.name);
break;
}
else{
}
}
}
catch (ActivityNotFoundException e) {
Toast.makeText(this.getApplicationContext(), "There was a problem loading the application: "+application_name,Toast.LENGTH_SHORT).show();
}
}
答案 2 :(得分:0)
对于启动器应用程序需要活动。您可以使您的活动透明化。您无法将服务创建为应用。是的,但你能做的一件事
您可以从您的活动中创建另一个流程,在另一个流程中您可以开始服务。
对于单独进程中的create service,您需要在manifest.xml中添加:process
属性。
这样你就可以在不同的进程中调用你的服务,不同的进程不会共享非静态和静态的动态内存。