Android创建服务应用程序

Android创建服务应用程序,android,Android,我的场景是:我有两个应用程序Main和WSCaller Main是一个应用程序,它调用WSCaller执行一些WS-call并等待结果 WSCaller是一个不需要任何活动、屏幕或启动器图标的应用程序。它就像一个在后台运行并将数据返回主应用程序的服务应用程序 我可以创建这样一个WSCaller应用程序吗 我试图创建一个简单的,如下所示 AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest x

我的场景是:我有两个应用程序Main和WSCaller

  • Main是一个应用程序,它调用WSCaller执行一些WS-call并等待结果
  • 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>
大体上,我做到了:

Intent intent = new Intent("mypackage.CALL_WS");
sendBroadcast(intent);
但是WSCaller没有启动并接收消息

我怎样才能让它工作


谢谢。

所有Android应用程序都需要启动活动。所以你需要有某种占位符用户界面。您还需要在清单中声明服务

像这样:

<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" >
. . .

. . .


来源:

我认为问题在于,它是一个独立的应用程序。这就是为什么它遵循自己的配置

在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();
        }
}
private void launchComponent(字符串packageName,字符串名称)
{
Intent-launch_-Intent=newintent(“android.Intent.action.MAIN”);
launch_intent.addCategory(“android.intent.category.LAUNCHER”);
启动_intent.setComponent(新组件名(packageName,name));
启动\u intent.setFlags(intent.FLAG\u活动\u新任务);
这是启动服务(启动意图);
}
public void startApplication(字符串应用程序名称)
{
试一试{
Intent-Intent=newintent(“android.Intent.action.MAIN”);
addCategory(“android.intent.category.LAUNCHER”);
//intent.setAction(intent.)
intent.addFlags(intent.FLAG\u活动\u无\u动画);
List resolveinfo_List=this.getPackageManager().queryInputActivities(intent,0);
对于(ResolveInfo:ResolveInfo_列表)
{
if(info.activityInfo.packageName.equalsIgnoreCase(应用程序名称))
{
启动组件(info.activityInfo.packageName、info.activityInfo.name);
打破
}
否则{
}
}
}
捕获(ActivityNotFounde异常){
Toast.makeText(this.getApplicationContext(),“加载应用程序时出现问题:“+application\u name,Toast.LENGTH\u SHORT).show();
}
}

启动程序应用程序需要活动。您可以使您的活动透明化。您无法将服务创建为应用程序。是的,但是你可以做一件事

您可以从活动中创建另一个流程,并在另一个流程中启动服务

要在单独的进程中创建服务,需要在manifest.xml中添加
:process
属性


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

那么,您可以添加一些代码来说明WSCaller如何将数据返回到Main吗?非常感谢。也许您想在服务类中使用OnBind函数。看见您可以使用绑定器与绑定服务的活动进行通信。谢谢您,RockerNAP,这就是我要寻找的:删除清单文件中的所有活动配置,只保留服务。
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();
        }
}