IntentService:为什么我的onHandleIntent从未被调用?

28
我正在使用Android XML-RPC与服务器进行连接。为此,我使用了IntentService。唯一的问题是,当启动服务器类时,我的onHandleIntent(其中包含服务器)从未被调用。
我做了一些研究,发现有人遇到了同样的问题。他通过使用超级类来解决了这个问题,但我是编程新手,没有成功实现他所做的操作 ==> link 以下是我的代码:
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();
        }

    }

  }

1
请参考此示例:Android基础教程:IntentService入门 - Lalit Poptani
@ Lalit Poptani:我读了这篇文章,但它没有说明为什么我的onHandle意图没有被调用。我有相同的代码:( 我感谢你的帮助! - youssoua
8个回答

42
如果你来到这里,但什么也没起作用,请检查你的manifest文件是否像这样:
    <service android:name=".subpackage.ServiceClassName" >
    </service>

而不是这样:

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

XML的闭合标签出现了问题。第一个是有效的,但第二个是合法的却无效。


两件事情:真的吗?此外,通常情况下,使用IntentService时我们仍然希望定义一个Intent-Filter,因此通常会得到第一个。 - edthethird

28

如果有其他人需要结果,这就是我应该做的。在 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();
        }
    }
}

20

摒弃onStart()。首先,它已经过时了。其次,你没有链接到超类,因此阻止了IntentService的工作。


我已经摆脱了 onStart()(用 onStartCommand() 替换它),并添加了两个超类 ==> 现在它运行得非常好 :-) - youssoua

19
我曾遇到同样的问题,后来发现在应用清单中缺少服务定义。

添加:

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

问题已解决。


我不得不设置 android:exported="true" 才能使其正常工作。 - g2server

15

简而言之:如果您重写onStartCommand方法,请不要忘记调用super:

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

    return START_STICKY;
}
如果没有,请检查您的清单文件,参见Mister Smith的回答。

5

我遇到了这个问题,但只在某些设备上出现,更具体地说是在Motorola Moto G第一代(4.5英寸且没有4G)上,解决方案是在清单中的Service描述中包含完整的包名。

所以将'mypackage.MyService'更改为'com.android.myapp.mypackage.MyService'解决了onHandleIntent永远不会被调用的问题。


3

有些人可能会看到这个页面,因为尽管您已经完美实现了一切,但您的onHandleIntent()方法从未被调用。

如果您正在尝试测试第一个服务,则可能不知道权限的重要性。在这种情况下,请检查您的权限。

希望这能对某人有所帮助。


1

我曾经遇到过同样的问题。我删除了OnCreate方法,现在它可以完美运行了。如果它对你有用,请告诉我 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接