2017-02-11 171 views
0

我在START_STICKY模式如何杀死

以下的服务创建的应用程序后,坚持在服务对象和变量是我的服务类

public class KeepAliveStatusMessageService extends Service { 
private Timer keepAliveStatusMessageTimer; 
private TimerTask timerJob; 
private JsHandler javaSHandler; 

protected void doInBackground() { 
    javaSHandler =LoginActivity.javaSHandler; //JSHandlerSingleton.getInstance().getJavaSHandlerLogin(); 
    keepAliveStatusMessageTimer = new Timer(); 
    AllTimer.getInstance().setKeepAliveStatusMessageTimer(keepAliveStatusMessageTimer); 
    timerJob = new TimerTask() { 
     @Override 
     public void run() { 
      UserInformationProvider userInformationProvider = UserInformationProvider.getInstance(); 
      javaSHandler =GladiusLoginActivity.javaSHandler; 
      Log.v("Service","called"); 
      javaSHandler.keepAliveStatusMessage(userInformationProvider.getIpAddress(), userInformationProvider.getUsername(), userInformationProvider.getSessionId()); 
     } 

     ; 
    }; 
    keepAliveStatusMessageTimer.schedule(timerJob, 5 * 1000, 5 * 1000); 
} 
@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.i("LocalService", "Received start id " + startId + ": " + intent); 
    doInBackground(); 
    return START_STICKY; 
} 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 
} 

此服务工作完美,当我用我的应用程序或去在后台, 但是当我从背景刷卡杀我的应用我收到以下错误

致命异常:定时器0 进程:com.me.cst,PID:18897 java.lang.NullPointerException:尝试调用虚方法void com.me.interfaces.JsHandler.keepAliveStatusMessage(java.lang.String,java.lang.String,java。在com.me.service.KeepAliveStatusMessageService $ 1.run(KeepAliveStatusMessageService.java:67) 上的空对象引用 lang.String)”在java.util.Timer中$ TimerImpl.run(Timer.java:284)

我不知道为什么JsHandler杀死应用程序后变为空。 请帮助我在杀死应用程序后调用该方法,因为服务未被中止只有该值变为空。 任何建议表示赞赏.. 请原谅我的英语...

EDIT1: JsHandler是下贱JsHandler.java类的。这个类用来调用从那里网络调用将被发送的Java脚本方法。 以下是JsHandler类的简报 JsHandler.java

public class JsHandler { 
    Activity activity; 
    WebView webView; 
    Handler handler = new Handler(); 
    public JsHandler(Activity _contxt, WebView _webView, Handler handler) { 
     activity = _contxt; 
     webView = _webView; 
     this.handler = handler; 
    } 
public void keepAliveStatusMessage(String ip, String username, String sessionId) { 
     final String webUrl = "javascript:keepAliveStatusMessage('" + ip + "','" + username + "','" + sessionId + "')"; 
     activity.runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       webView.loadUrl(webUrl); 
      } 
     }); 
    } 
} 

我创建JsHandler的静态变量LoginActivity.java 我做了静态变量,因为我不能够通过putExtra方法传递对象在启动方法

public static JsHandler javaSHandler; 

和分配值

javaSHandler = new JsHandler(this, loginWebView, new Handler()); 

在KeepAliveStatusMessage.java类中,我正在访问该静态变量。 来调用JsHandler类的keepAlive方法。

回答

0

我不知道为什么JsHandler杀死应用程序后变为空。

您的流程已终止。然后,Android为您启动一个全新的流程,开始您的粘性服务的全新副本。但是,您指的是static字段(GladiusLoginActivity.javaSHandler),该字段在此新过程中不会被初始化。因此,当您尝试调用该对象上的方法时会崩溃,因为它将是null

+0

所以有办法解决这个问题 我试过Singleton类,但是给我空 – MKY

+0

@MKY:我不知道什么'javaSHandler'是什么,它做什么,为什么它是一个单身人士,为什么你认为它会存在。我甚至不知道这整个服务是什么,因为它似乎没有做任何事情。所以,也许解决办法是摆脱服务本身。除此之外,我不能真正帮助你,除非你编辑你的问题并详细解释,**详细说明**,你试图用这个代码来完成什么。 – CommonsWare

+0

@MKY:肯定会摆脱服务。当你的进程终止时,**你的'WebView'不见了**,所以服务没有任何事情可做。 – CommonsWare