Подтвердить что ты не робот

IntentService: почему мой onHandleIntent никогда не называется?

Я работаю с android xml rpc для монтирования сервера. Для этого я использую and intentService. Единственная проблема заключается в том, что при запуске класса сервера мой onHandleIntent, который содержит сервер, никогда не вызывается.

Я провел некоторое исследование, и я нашел кого-то, у кого была такая же проблема, ему удалось решить его, используя суперкласс, но я новичок в программировании и не смог сделать то, что он did == > ссылка

Вот мой код:

package tfe.rma.ciss.be;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlrpc.android.MethodCall;
import org.xmlrpc.android.XMLRPCServer;

import android.app.IntentService;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

import java.io.IOException;
import java.io.StringReader;
import java.net.MalformedURLException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class Server extends IntentService {
   public String myData="";
   public String streamTitle = "",path="";

   public void onCreate() {

        Log.d("Server", ">>>onCreate()");

    }

    public Server() {
        super("Server");


    }
    public void onStart (Intent intent, int startId) {
        Log.d("Server", ">>>Started()");    }
    @Override
    protected void onHandleIntent(Intent intent) {
        Log.d("Server", ">>>handlingIntent()");
        try {
            ServerSocket socket = new ServerSocket(8214);
            XMLRPCServer server = new XMLRPCServer();
            Log.d("Server", ">>>opening on port" + socket);
            while (true) {
                Socket client = socket.accept();
                MethodCall call = server.readMethodCall(client);
                String name = call.getMethodName();
                if (name.equals("newImage")) {
                    ArrayList<Object> params = call.getParams();
                    // assume "add" method has two Integer params, so no checks done
                   myData = (String)( params.get(0));
                    //int i1 = (Integer) params.get(1);
                    server.respond(client, new Object[] {200});
                    /*intent = new Intent (this, ParseFunction.class);
                 startService (intent);  */

                    Toast.makeText(this, myData, Toast.LENGTH_SHORT).show();  
                    Log.d("ParseFunction", ">>>Started()"); 

                    Intent i = new Intent( this, B.class );

                    i.putExtra( "Azo", myData);


                   i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity( i );

                } else {
                    server.respond(client, null);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }

    }

  }
4b9b3361

Ответ 1

Если кто-то хочет получить результат, вот что я должен был сделать. Добавив суперкласс к onCreate super.onCreate() и изменив onStart на onStartCommand (плюс его суперкласс super.onStartCommand()), теперь он работает как прелесть

package tfe.rma.ciss.be;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlrpc.android.MethodCall;
import org.xmlrpc.android.XMLRPCServer;

import android.app.IntentService;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

import java.io.IOException;
import java.io.StringReader;
import java.net.MalformedURLException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class Server extends IntentService {
    public String myData="";
    public String streamTitle = "",path="";

    public void onCreate() {
        super.onCreate();
        Log.d("Server", ">>>onCreate()");
    }

    public Server() {
        super("Server");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, startId, startId);
        Log.i("LocalService", "Received start id " + startId + ": " + intent);

        return START_STICKY;
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.d("Server", ">>>handlingIntent()");
        try {
            ServerSocket socket = new ServerSocket(8214);
            XMLRPCServer server = new XMLRPCServer();
            Log.d("Server", ">>>opening on port" + socket);

            while (true) {
                Socket client = socket.accept();
                MethodCall call = server.readMethodCall(client);
                String name = call.getMethodName();

                if (name.equals("newImage")) {
                    ArrayList<Object> params = call.getParams();
                    // assume "add" method has two Integer params, so no checks done
                    myData = (String)( params.get(0));
                    //int i1 = (Integer) params.get(1);
                    server.respond(client, new Object[] {200});
                    /*intent = new Intent (this, ParseFunction.class);
                    startService (intent);  */

                    Toast.makeText(this, myData, Toast.LENGTH_SHORT).show();  
                    Log.d("ParseFunction", ">>>Started()"); 

                    Intent i = new Intent( this, B.class );
                    i.putExtra( "Azo", myData);
                    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity( i );
                } else {
                    server.respond(client, null);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
    }
}

Ответ 2

Если вы пришли сюда, и ничего не получилось, проверьте, что ваш манифест выглядит следующим образом:

    <service android:name=".subpackage.ServiceClassName" >
    </service>

И не так:

    <service android:name=".subpackage.ServiceClassName" />

Есть проблема с закрывающими тегами xml. Первый работает. Второй законен, но не работает.

Ответ 3

Избавьтесь от onStart(). Во-первых, он устарел. Во-вторых, вы не привязываетесь к суперклассу, тем самым не позволяя IntentService выполнять свою работу.

Ответ 4

У меня была такая же проблема, оказалось, что в манифесте приложения отсутствует определение службы.

Добавление:

<service
   android:name=".MyIntentServiceName"
   android:exported="false" />

решил проблему.

Ответ 5

Просто подведем итог: в случае, если вы переопределите onStartCommand, не забудьте вызвать super:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, startId, startId);

    return START_STICKY;
}

Если нет, проверьте манифест, см. ответ Мистер Смит.

Ответ 6

У меня была эта проблема, но только на некоторых устройствах, в частности на Motorola Moto G 1st Gen (4,5 "и 4G-less), и решение заключалось в том, чтобы включить FULL PACKAGE NAME в описание сервиса в манифесте.

Итак, меняя "mypackage.MyService" на "com.android.myapp.mypackage.MyService", решил, что onHandleIntent никогда не вызывается.

Ответ 7

Некоторые из вас могут попасть на эту страницу, потому что ваш метод onHandleIntent() никогда не будет вызван, несмотря на то, что вы все это прекрасно выполнили.

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

Я надеюсь, что это поможет кому-то.

Ответ 8

У меня была та же проблема. Я удалил метод OnCreate и теперь работает как шарм. LMK, если он сработает для вас:)