2015-09-08 4 views
1

Мой сценарий: у меня есть два приложения Main и WSCaller.Android создать приложение-приложение

  • Главное приложение, которое призывает 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 не запускается и появляется сообщение.

Как я могу заставить его работать?

спасибо.

ответ

2

Все приложения для 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" > 
. . . 

Источник: http://developer.android.com/guide/topics/manifest/service-element.html

+0

Итак, не могли бы вы добавить код, чтобы показать, как WSCaller возвращает данные обратно в Main? Большое спасибо. –

+0

Возможно, вы хотите использовать функцию OnBind в классе Service. см. http://developer.android.com/guide/components/bound-services.html.Вы можете использовать связующее для связи с Управлением, которое связывает службу. – Rockernaap

+0

Спасибо, Rockernaap, это то, что я ищу: удалить всю конфигурацию активности в файле манифеста, сохранить только сервис. –

1

Я думаю, что проблема заключается в том, что это отдельный application.And, именно поэтому следует своей собственной конфигурации.

На 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(); 
     } 
} 
0

Для запуска приложения требуется действие. Вы можете сделать свою деятельность прозрачной. Вы не можете создать сервис как приложение. Да, но одна вещь, которую вы можете сделать

Вы можете сделать другой процесс из своей деятельности, а в другом процессе вы можете начать сервис.

Для создания сервиса в отдельном процессе вам нужно добавить атрибут :process в manifest.xml.

так что вы можете позвонить в службу в разных процессах, а другой процесс не будет делиться нестационарной и статической динамической памятью.

Смежные вопросы