我正在使用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();
}
}
}
答案 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如果适合你:)