intentService:为什么我的onHandleIntent永远不会被调用?

时间:2012-01-31 13:34:13

标签: java android

我正在使用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();
        }

    }

  }

8 个答案:

答案 0 :(得分:39)

如果你到达这里并且没有任何效果,请检查你的清单是这样的:

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

而不是这样:

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

xml结束标记存在问题。第一个有效。第二种是合法的,但不起作用。

答案 1 :(得分:26)

如果其他人想要这里的结果是我应该做的。将超类添加到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 :(得分:19)

摆脱onStart()。首先,它已经过时了。其次,您没有链接到超类,从而阻止IntentService完成其工作。

答案 3 :(得分:17)

我遇到了同样的问题,结果发现App清单中缺少服务定义。

添加:

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

解决了这个问题。

答案 4 :(得分:11)

总结一下:在你重写onStartCommand的情况下,不要忘记调用super:

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

    return START_STICKY;
}

如果没有,请检查您的清单,查看Mister Smith的答案。

答案 5 :(得分:5)

我遇到了这个问题,但仅限于某些设备,更具体地说是摩托罗拉Moto G 1st Gen(4.5“和4G-less),解决方案是在Manifest的服务描述中包含FULL PACKAGE NAME。

因此将'mypackage.MyService'更改为'com.android.myapp.mypackage.MyService'解决了onHandleIntent永远不会被调用。

答案 6 :(得分:3)

有些人可能会访问此页面,因为您的onHandleIntent()方法永远不会被调用,尽管您已经很好地实现了所有内容。

如果这是您尝试测试的第一个服务,您可能不会意识到权限的重要性。在这种情况下,请检查您的权限。

我希望这有助于某人。

答案 7 :(得分:0)

我遇到了同样的问题。我删除了OnCreate方法,现在就像魅力一样。 LMK如果适合你:)