Запустите IntentService из другого приложения

Я пытаюсь запустить IntentService из другого приложения, теперь у меня есть Activity с AsyncTask, где я загружаю файл. Это работает нормально, но я хочу загрузить файл в IntentService и не должен показывать активность, только уведомление. Это возможно? Я прочитал, что IntentService запускается, когда Activity вызывает его через startService(Intent), но при попытке ничего не происходит:(

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_bajar);

    intent = getIntent();
    String action = intent.getAction();
    String type = intent.getType();

    if(Intent.ACTION_SEND.equals(action) && type != null){
        if("text/plain".equals(type)){
            String todo = intent.getStringExtra(Intent.EXTRA_TEXT);
            if(todo != null){
                id = new Descarga(todo);
                EditText textNombre = (EditText) findViewById(R.id.TextNombre);
                textNombre.setText(id.nombre);
                /*
                This works
                d = new Download();
                d.execute();
                /*
                startService(intent); //This don´t work
            }
        }
    }
}

Это XML-файл Activity:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="es.esy.palmaseca.descargayt.Bajar">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/nombre"
    android:id="@+id/txtNombre"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_gravity="center" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/TextNombre"
    android:layout_below="@+id/txtNombre"
    android:layout_centerHorizontal="true"
    android:editable="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="0"
    android:id="@+id/txtActual"
    android:layout_marginTop="44dp"
    android:layout_below="@+id/TextNombre"
    android:layout_centerHorizontal="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="0"
    android:id="@+id/txtFinal"
    android:layout_below="@+id/txtActual"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="35dp" />

<ProgressBar
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/barra"
    android:layout_below="@+id/txtFinal"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="55dp" />

Мой класс IntentService:

public class Descargar extends IntentService {

NotificationManager nm;
Notification notification;
static String ns = Context.NOTIFICATION_SERVICE;
int icono = R.drawable.icono;

public Descargar() {
    super("Descargar");
    Log.d("Serivicio", "Star");
}

@Override
protected void onHandleIntent(Intent intent) {



    String action = intent.getAction();
    String type = intent.getType();

    if(Intent.ACTION_SEND.equals(action) && type != null){
        if("text/plain".equals(type)){
            String todo = intent.getStringExtra(Intent.EXTRA_TEXT);
            if(todo != null){
                Descarga d = new Descarga(todo);
                bajar(d);
            }
        }
    }
}

Функция bajar такая же, как Download AsynTask.

И наконец манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="es.esy.palmaseca.descarga" >
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<application
    android:allowBackup="true"
    android:icon="@drawable/icono"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service
        android:enabled="true"
        android:name=".Descargar"
        android:exported="true" >
    </service>

    <activity
        android:name=".Bajar"
        android:label="@string/bajar" >
        <intent-filter>
            <action android:name="android.intent.action.SEND" />

            <category android:name="android.intent.category.DEFAULT" />

            <data android:mimeType="text/plain" />
        </intent-filter>
    </activity>
</application>

Я попытался запустить IntentService, но я не могу определить, где была ошибка, и выдает 0 ошибок.

Извините мой английский

1 ответ

Простое решение - создать BroadcastReceiver, зарегистрировать его в манифесте для какого-либо намеренного действия и затем запустить службу intentservice.

public class Descargar extends IntentService {

NotificationManager nm;
Notification notification;
static String ns = Context.NOTIFICATION_SERVICE;
int icono = R.drawable.icono;

public static class DescargarReceiver implements BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

    ComponentName comp = new ComponentName(context.getPackageName(), Descargar.class.getName());

    context.startService(intent.setComponent(comp));

    }
}


public Descargar() {
    super("Descargar");
    Log.d("Serivicio", "Star");
}

@Override
protected void onHandleIntent(Intent intent) {

    String action = intent.getAction();
    String type = intent.getType();

    if(Intent.ACTION_SEND.equals(action) && type != null){
        if("text/plain".equals(type)){
            String todo = intent.getStringExtra(Intent.EXTRA_TEXT);
            if(todo != null){
                Descarga d = new Descarga(todo);
                bajar(d);
            }
        }
    }
}

и в манифесте:

<receiver
    android:name=".Descargar$DescargarReceiver"
    android:exported="true>
    <intent-filter>
        <action
            android:name="com.mycompany.action.START_DESCARGAR_SERVICE" />
    </intent-filter>
</receiver>


    <service
        android:enabled="true"
        android:name=".Descargar"
        android:exported="true" >
    </service>

и тогда вы можете просто передать намерение из любого приложения:

Intent intent = new Intent("com.mycompany.action.START_DESCARGAR_SERVICE");
intent.putExtra(.....)
sendBroadcast(intent);
Другие вопросы по тегам