Android创建服务应用程序

时间:2015-09-08 08:43:45

标签: android

我的方案是:我有两个应用程序Main和WSCaller。

  • Main是一个应用程序,它调用WSCaller来执行一些WS调用并等待结果。
  • 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没有启动并收到消息。

我怎样才能让它发挥作用?

谢谢。

3 个答案:

答案 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属性。

这样你就可以在不同的进程中调用你的服务,不同的进程不会共享非静态和静态的动态内存。