Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么服务会在一段时间后自动停止(大约每10-15分钟一次)_Android - Fatal编程技术网

Android 为什么服务会在一段时间后自动停止(大约每10-15分钟一次)

Android 为什么服务会在一段时间后自动停止(大约每10-15分钟一次),android,Android,我创建了服务,该服务在设备重新启动时启动,但有时会自动停止,因为我必须每10-15分钟重新启动一次设备。我希望我的服务在关闭设备之前一直在后台运行。请提供帮助。我的代码如下: Socketreceiver.java package com.test.Socketreceiver; import java.net.Socket; import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver;

我创建了服务,该服务在设备重新启动时启动,但有时会自动停止,因为我必须每10-15分钟重新启动一次设备。我希望我的服务在关闭设备之前一直在后台运行。请提供帮助。我的代码如下:

Socketreceiver.java

package com.test.Socketreceiver;

import java.net.Socket;
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;


public class Socketreceiver extends BroadcastReceiver {

    private final String BOOT_COMPLETED_ACTION = "android.intent.action.BOOT_COMPLETED";
    public static final int SERVERPORT = 8060;
    public static String tag = "Socketreceiver";
    public static boolean flgvoid = false;
    public static SerialportCommunication spComm = new SerialportCommunication();
    //static BluetoothAdapter mBluetoothAdapter;

    /** Called when the activity is first created. */

    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        if (intent.getAction().equals(BOOT_COMPLETED_ACTION)) {
        Logger.createFile();
            Logger.writeLOG("start app..", "app started...........................");
            Intent myIntent = new Intent(context, SocketreceiverService.class);
            context.startService(myIntent);

            if(!flgvoid){
                spComm.initalizeCommand();
                Logger.writeLOG(tag, "initializing serialport");
            }

            SocketreceiverService.setUpdateListener(serverCompleted);

        }
    }

    public SocketreceiverListener serverCompleted = new SocketreceiverListener() {

        public void response(Socket s, String datareceived) {
            // TODO Auto-generated method stub
            Log.d(tag, "data=" + datareceived);

            if(datareceived.contains("void")){
                String originaldatareceived = datareceived;
                flgvoid = true;
                datareceived = originaldatareceived.replace("void", "");

                Logger.writeLOG(tag," response recived after replacing void ="+datareceived);
            }else
                flgvoid = false;

            Logger.writeLOG(tag," response recived ="+datareceived);
            boolean checkRequest = SocketreceiverService.checkXMLrequest(datareceived);
            //System.out.println("checkst="+checkRequest);
            //this is used to card swipe over serial port
        //  boolean checkRequest = false;
            if (checkRequest) {

                //stop prompting swipecard reader
                if(!flgvoid){

                    Logger.writeLOG(tag,"Initilizing the Swipe device");
                    //SerialportCommunication spComm = new SerialportCommunication();
                    spComm.setReciveddata(datareceived);
                    spComm.setCliebntsocket(s);
                    //spComm.initalizeCommand();
                    spComm.swipecardCommand();
                    //SocketreceiverService.sendtoClient(s, "service returns="+datareceived);
                }
                else
                {   Logger.writeLOG(tag,"sending intermediate data");
                    SocketreceiverService.sendtoClient(s, "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><whizpay><IntermdMsg><ResponseCode>00</ResponseCode><ResponseMsg>Void Response</ResponseMsg></IntermdMsg></whizpay>");


                    SocketreceiverService.sendResponse(s, datareceived,"");
                    Logger.writeLOG(tag,"sending response");
                }
            }else{
                SocketreceiverService.sendTowizpay(s, datareceived);

            }
        }
    };

    /*public String addEncryptionTag(String data) {
        String dataTag = "<EncryptedInfo><EncryptionLevel>3</EncryptionLevel><EncryptedData>"
                + data + "</EncryptedData></EncryptedInfo>";
        return dataTag;
    }*/

}
package com.test.Socketreceiver;
导入java.net.Socket;
导入android.bluetooth.BluetoothAdapter;
导入android.content.BroadcastReceiver;
导入android.content.Context;
导入android.content.Intent;
导入android.util.Log;
公共类Socketreceiver扩展了BroadcastReceiver{
私有最终字符串BOOT\u COMPLETED\u ACTION=“android.intent.ACTION.BOOT\u COMPLETED”;
公共静态最终int服务器端口=8060;
公共静态字符串tag=“Socketreceiver”;
公共静态布尔值flgvoid=false;
public static SerialportCommunication spComm=new SerialportCommunication();
//静态蓝牙适配器mBluetoothAdapter;
/**在首次创建活动时调用*/
公共void onReceive(上下文、意图){
//TODO自动生成的方法存根
if(intent.getAction().equals(启动完成动作)){
Logger.createFile();
Logger.writeLOG(“启动应用程序…”,“应用程序启动…”);
Intent myIntent=新的Intent(上下文,SocketreceiverService.class);
启动服务(myIntent);
如果(!flgvoid){
spComm.initializeCommand();
Logger.writeLOG(标记“初始化串行端口”);
}
SocketreceiverService.setUpdateListener(服务器已完成);
}
}
公共SocketreceiverListener服务器已完成=新建SocketreceiverListener(){
公共无效响应(套接字、字符串数据接收){
//TODO自动生成的方法存根
Log.d(标记“data=“+datareceived”);
if(datareceived.contains(“void”)){
字符串originaldatareceived=datareceived;
flgvoid=真;
datareceived=originaldatareceived.replace(“void”和“”);
Logger.writeLOG(标记,“替换void=“+数据接收后接收到的响应”);
}否则
flgvoid=false;
Logger.writeLOG(标记“response received=“+datareceived”);
布尔checkRequest=SocketreceiverService.checkXMLrequest(datareceived);
//System.out.println(“checkst=“+checkRequest”);
//这用于通过串行端口刷卡
//布尔checkRequest=false;
如果(检查请求){
//停止提示swipecard阅读器
如果(!flgvoid){
Logger.writeLOG(标记“初始化刷卡设备”);
//SerialportCommunication spComm=新的SerialportCommunication();
spComm.SetReceivedData(数据接收);
spComm.setCliebntsocket(多个);
//spComm.initializeCommand();
spComm.swipecardCommand();
//SocketreceiverService.sendtoClient,“服务返回=”+数据接收);
}
其他的
{Logger.writeLOG(标记,“发送中间数据”);
SocketreceiverService.sendtoClient(s,“00Void响应”);
SocketReceiveService.sendResponse(s,datareceived,“”);
Logger.writeLOG(标记“发送响应”);
}
}否则{
SocketreceiverService.sendTowizpay(已接收数据);
}
}
};
/*公共字符串addEncryptionTag(字符串数据){
字符串dataTag=“3”
+数据+“”;
返回数据标签;
}*/
}
AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.test.Socketreceiver"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name="com.test.Socketreceiver.Socketreceiver" 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:name="com.test.Socketreceiver.SocketreceiverService" />
        <receiver android:name="com.test.Socketreceiver.Socketreceiver" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

SocketreceiverService.java

package com.test.Socketreceiver;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class SocketreceiverService extends Service {

    private static SocketreceiverListener serverLISTENER;
    final static String tag = "SocketreceiverService";
    private Thread serverThread;
    private ServerSocket serverSocket;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        Toast.makeText(this, "whizpay Service Created", Toast.LENGTH_LONG).show();
        Logger.writeLOG(tag," whizpay Service Created");
        Log.d(tag, "onCreate");

    }

    @Override
    public void onDestroy() {
        Toast.makeText(this, "wizpay Service Stopped", Toast.LENGTH_LONG).show();
        Logger.writeLOG(tag," whizpay Service Stopped");
        Log.d(tag, "onDestroy");
        if (serverSocket != null) {
            try {
                serverSocket.close();
                stopServer();
                Logger.writeLOG(tag," server closed...");
            } catch (Exception e) {
                // TODO: handle exception
                Log.d(tag, "exception=" + e.getMessage());
                Logger.writeLOG(tag,"@ line 56 exception=" + e.getMessage());
            }
        }
    }

    @Override
    public void onStart(Intent intent, int startid) {
        Toast.makeText(this, "wizpay Service Started", Toast.LENGTH_LONG).show();
        Logger.writeLOG(tag,"whizpay Service Started");
        Log.d(tag, "onStart");
        startServer();
        Logger.writeLOG(tag,"start serial port...Testing starts.....");
        Logger.writeLOG(tag,"start serial port...Testing  ends......");
    }

    private synchronized void startServer() {
        if (serverThread == null) {
            Toast.makeText(this, "Started server", Toast.LENGTH_LONG).show();
            Logger.writeLOG(tag , " Started server");
            serverThread = new Thread(thread);
            serverThread.start();
        }
        else
        {
            Logger.writeLOG(tag , " close current and open again");
            if(serverThread.isAlive())
            {
                if (serverSocket != null) {
                    try {
                        serverSocket.close();
                        stopServer();
                        Logger.writeLOG(tag," server closed...");

                    } catch (Exception e) {
                        // TODO: handle exception
                        Log.d(tag, "exception=" + e.getMessage());
                        Logger.writeLOG(tag,"@ line 56 exception=" + e.getMessage());
                    }
                }
            }
            serverThread = new Thread(thread);
            serverThread.start();
            Logger.writeLOG(tag," server started again...");
        }
    }

    private synchronized void stopServer() {
        if (serverThread != null) {
            Logger.writeLOG(tag , " WhizPay Service Stoped");
            Thread t = serverThread;
            serverThread = null;
            t.interrupt();
            serverSocket =null;
        }

    }

    public void onStop(Intent intent, int startid) {
        Logger.writeLOG(tag , " WhizPay Service onStop");
        Log.d(tag, "onStop");
    }

    private Runnable thread = new Runnable() {

        public synchronized void run() {
            try {
                //Logger.writeLOG(tag ," Receiving starts ="+serverSocket);
                serverSocket = new ServerSocket(Socketreceiver.SERVERPORT);
                Logger.writeLOG(tag ," new socket ="+serverSocket);
                String data = "";
                Socket client=null;
                while (true) {
                     client= serverSocket.accept();
                    Log.d(tag, "S: Receiving...");
                    try {
                        BufferedReader in = new BufferedReader(
                                new InputStreamReader(client.getInputStream()));
                        String line = null;
                        line = in.readLine();
                        if(line!=null){
                            if (serverLISTENER != null) {
                                Log.d(tag, "Received..=" + line);
                                // String receivedData=""+abc;
                                data = line;
                                System.out.println("Received..data=" + data);
                                Logger.writeLOG(tag ," Received..= data" + data);
                                serverLISTENER.response(client, data);
                                break;
                            }
                        }
                    } catch (Exception e) {
                        // e.printStackTrace();
                        Log.d(tag, "123Exception=" + e.getMessage());
                        Logger.writeLOG(tag , " Exception@ 130 ="+e.getMessage());
                    }
                }
                Logger.writeLOG(tag ," starts server 1...");
                startServer();
                Logger.writeLOG(tag ," starts server 2...");
            } catch (IOException e) {
                Log.e(tag, "error==" + e.getMessage());
                Logger.writeLOG(tag , " Exception@ 136 ="+e.getMessage());
            }
        }
    };

    public static void setUpdateListener(SocketreceiverListener l) {
        serverLISTENER = l;
    }

    // if something went wrong in communication error code will be -1. 
    // send this error to client.
    // if error code  is 0 then get response from wizpay for that xml & send response to client
    public static void senderrorResponse(Socket s, int errorCode,String errormessage) {
        // TODO Auto-generated method stub
        Logger.writeLOG(tag," sendResponse satrts error code="+errorCode);
        Logger.writeLOG(tag," sendResponse satrts error code="+errormessage);
        sendtoClient(s, errorCode+"#"+errormessage);
    }

    //This will add data received from bluetooth to data received on socket.
    // create new request. send to wizpay
    // send response back to client
    public static void sendResponse(Socket s, String dataFromclient,String dataFrombluetooth) {
        Log.i("test1 dataFrombluetooth=",dataFrombluetooth);
        Logger.writeLOG(tag, "test1 dataFrombluetooth="+dataFrombluetooth);
        Log.i("test1 dataFromclient=",dataFromclient);
        Logger.writeLOG(tag, "test1 dataFromclient="+dataFromclient);
        String wizpayResponse="";
        int indexBt = dataFrombluetooth.indexOf("EncryptedInfo");
        //Comment for whizpay
        if(indexBt<0){ 

          if(Socketreceiver.flgvoid){
                //{
            String newwizpayRequest = createWhizpayXmlrequest(dataFromclient,dataFrombluetooth);
            //}
            //System.out.println("new wizpay request...="+newwizpayRequest);
            Logger.writeLOG(tag, "new whizpay request...="+newwizpayRequest);
            boolean ispayment = checkXMLrequest(newwizpayRequest);
            wizpayCommuniction wizpayrequest = new wizpayCommuniction();
            wizpayrequest.setXMLRequest(newwizpayRequest);
            wizpayrequest.setOtherData(ispayment);
            wizpayResponse = wizpayrequest.getResponsefromwizpay();
            }
          else{
            // something went wrong in Bluetooth communication
                // send error back
            wizpayResponse = dataFrombluetooth;
            Log.e(tag,"error in BT...="+wizpayResponse);
            Logger.writeLOG(tag, "error in BT...="+wizpayResponse);
          }
        }else{
        // TODO Auto-generated method stub
            //{
                String newwizpayRequest = createWhizpayXmlrequest(dataFromclient,dataFrombluetooth);
            //}
            //System.out.println("new wizpay request...="+newwizpayRequest);
            Logger.writeLOG(tag, "new whizpay request...="+newwizpayRequest);
            boolean ispayment = checkXMLrequest(newwizpayRequest);
            wizpayCommuniction wizpayrequest = new wizpayCommuniction();
            wizpayrequest.setXMLRequest(newwizpayRequest);
            wizpayrequest.setOtherData(ispayment);
            wizpayResponse = wizpayrequest.getResponsefromwizpay();

            wizpayResponse +=SerialportCommunication.accountNumber;

            Logger.writeLOG(tag, "wizpayResponse after appending accountnumber...="+wizpayResponse);

        }//Comment for whizpay 
        Log.d(tag, "sending to base send response="+wizpayResponse);
        Logger.writeLOG(tag, "sending to base send response="+wizpayResponse);
        sendtoClient(s,wizpayResponse);
    }

    public static void sendtoClient(Socket s,String response){
        try {
            Log.d(tag, "S Sending..starts ");
            Logger.writeLOG(tag, "S Sending to client..starts ");
            PrintWriter out = new PrintWriter(new BufferedWriter(
                    new OutputStreamWriter(s.getOutputStream())), true);
            // where you issue the commands
            out.println(response);
            Log.d(tag, "S Sending to client..ends");
            Logger.writeLOG(tag, "S Sending to client..end ");
        } catch (Exception e) {
            Log.e(tag, "C: Error", e);
        } finally {
            Log.e(tag, "finally starts");

            try {
                int index=response.indexOf("CustomerToken");
                int index1=response.indexOf("<ResponseCode>99</ResponseCode>");
                int index2=response.indexOf("<ResponseCode>98</ResponseCode>");
                if(index>0||index1>0||index2>0)
                    s.close();
                System.out.println("closed server side.....");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    // there are 2 xml request one is payment && one is Registration request..
    // for payment BT should be called and add this BT to original xml & then send request to wizpay
    // for registration request should sent to whizpay directly
    //  for registration there is tag CustomerInformation return false
    // for payment there is tag  return true
    // for all other request returns false.. o this will forward request as it is to wizpay
    public static boolean checkXMLrequest(String tempdatareceived){
        Logger.writeLOG(tag," in checkXMLrequest starts ="+tempdatareceived);
        int stindex = tempdatareceived.indexOf("<Level1>");
        if(stindex>0){          //this is payment request. So start Bluetooth
            Logger.writeLOG(tag," return true");
            return true;
        }else
        {
            stindex = tempdatareceived.indexOf("<CustomerInformation>");
            if(stindex>0){      //this is registration request
                Logger.writeLOG(tag," return false 0");
                return false;
            }else{              // some other request
                Logger.writeLOG(tag," return false 1");
                return false;
            }
        }

    }

    //This will create new xml request..
    // data received on socket port + bluetoth data 
    public static String createWhizpayXmlrequest(String dataRecived,
      String BluetoothResponse) {
      String endofXML = "</Level1><Level2></Level2><Level3></Level3></whizpay>";
      String newxmlData = ""; 

    /*if(Socketreceiver.flgvoid)
    {
        Logger.writeLOG(tag," in createWhizpayXmlrequest for void transaction");

        newxmlData = dataRecived;
        Logger.writeLOG(tag," in createWhizpayXmlrequest newxmlData::" + newxmlData);

        newxmlData += endofXML;
        Logger.writeLOG(tag," in createWhizpayXmlrequest newxmlData::" + newxmlData);

    }else{  */
        // if any thing before Level1 take it..
        int stindex = dataRecived.indexOf("<Level1>");
        if(stindex>0)
        {
            newxmlData += dataRecived.substring(0,stindex);
        }
        // if any thing before Level1 take it..
        Logger.writeLOG(tag," in createWhizpayXmlrequest dataRecived="+dataRecived+"BluetoothResponse="+BluetoothResponse);
        Log.d(tag,"data b4 level1="+newxmlData);
        int endindex = dataRecived.indexOf("</Level1>");
        String neworgString = dataRecived.substring(stindex, endindex); // data between <wizpay> </wizpay> tag
        Log.d(tag,"data between levl1 tag==" + neworgString);
        newxmlData += neworgString;
        //newxmlData += "<Track1DataEncrypted>" + BluetoothResponse + "</Track1DataEncrypted>";
        newxmlData += BluetoothResponse ;
        newxmlData += endofXML;
        Log.d(tag,"new xml request =" + newxmlData);
        Logger.writeLOG(tag," new xml request =" + newxmlData);
    //}
        return newxmlData;
    }

    public static void sendTowizpay(Socket s,String dataRecived){
        Logger.writeLOG(tag,"sendTowizpay starts ");
        String wizpayResponse="";
        boolean ispayment = checkXMLrequest(dataRecived);
        Logger.writeLOG(tag,"is payment="+ispayment);
        wizpayCommuniction wizpayrequest = new wizpayCommuniction();
        wizpayrequest.setXMLRequest(dataRecived);
        wizpayrequest.setOtherData(ispayment);
        wizpayResponse = wizpayrequest.getResponsefromwizpay();
        Logger.writeLOG(tag,"sendTowizpay ends="+wizpayResponse);
        sendtoClient(s, wizpayResponse);
    }
}
package com.test.Socketreceiver;
导入java.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.io.OutputStreamWriter;
导入java.io.PrintWriter;
导入java.net.ServerSocket;
导入java.net.Socket;
导入android.app.Service;
导入android.content.Intent;
导入android.os.IBinder;
导入android.util.Log;
导入android.widget.Toast;
公共类SocketreceiverService扩展了服务{
私有静态SocketreceiverListener服务器侦听器;
最终静态字符串标记=“SocketreceiverService”;
私有线程服务器线程;
私有服务器套接字服务器套接字;
@凌驾
公共IBinder onBind(意向){
//TODO自动生成的方法存根
返回null;
}
@凌驾
public void onCreate(){
Toast.makeText(这是“whizpay服务创建的”,Toast.LENGTH_LONG.show();
Logger.writeLOG(标记“whizpay服务已创建”);
Log.d(标记为“onCreate”);
}
@凌驾
公共空间{
Toast.makeText(此“wizpay服务已停止”,Toast.LENGTH_LONG.show();
Logger.writeLOG(标记“whizpay服务已停止”);
Log.d(标签“onDestroy”);
if(serverSocket!=null){
试一试{
serverSocket.close();
stopServer();
Logger.writeLOG(标记“服务器已关闭…”);
}捕获(例外e){
//TODO:处理异常
Log.d(标记,“exception=“+e.getMessage());
Logger.writeLOG(标记“@line 56 exception=“+e.getMessage()”);
}
}
}
@凌驾
公共无效启动(Intent Intent,int startid){
Toast.makeText(此“wizpay服务已启动”,Toast.LENGTH_LONG.show();
Logger.writeLOG(标记“whizpay服务已启动”);
Log.d(标签“onStart”);