阻止活动在后台执行某些操作

问题描述:

我得到了以下场景: 我正在编写一个应用程序,它的作用类似于聊天客户端。它在启动时连接到服务器并正在侦听消息(网络事物由服务处理)。 我的问题是签字后几秒钟(有关的方法发送一个信号到服务器,然后停止服务和调用完成()),应用程序似乎再次登录没有做任何事情(我可以​​看到这在服务器日志)。我不知道如何处理这个问题,我的意思是阻止我的应用程序在后台再次登录。 方法登录被在我的主要活动的onCreate方法中创建的服务调用。我对android还不是很熟悉,我希望任何人都能给我一个提示。 在此先感谢。阻止活动在后台执行某些操作

问候, SMAU

编辑代码添加: 和我logcat的认可,我得到的,如“在XXXX毫秒坠毁服务调度重启” 的initNetwork方法和Timer类的消息缩短,有只是非常网络的东西ID不想自动执行由于自动服务重新启动。

public class NetworkService extends Service { 

public static String path; 
static ClientUserConfig myConfig; 
private ChatKeys keys; 

static Frontend_CS front_cs; 
static Frontend_CK front_ck; 

public static Boolean runOnce = true; 

private String server_ip = "10.0.2.2"; 

private static PPAClientActivity MAIN_ACTIVITY; 
private int serverConnectionTimer; 

private HashedWheelTimer timer; 

private final LinkedList<String> chatWindows = new LinkedList<String>(); 


class TimedChecksAndroid implements TimerTask { 

     public void run(Timeout tmt) { 
      String senderEmail; 
      String senderFullname; 
      LinkedList<String> list; 
      int selection; 
      int chatNum; 

      ClientUserEntry user; 

      if (serverConnectionTimer>=60){ 



} 





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

    super.onDestroy(); 


    shutdownService(); 

    if (MAIN_ACTIVITY != null) { 
     MAIN_ACTIVITY.showMessages(Consts.SERVICE_STOPPED); 
    } 
} 

private void shutdownService() { 

    Log.d("SERVICENET", "Shutdown reached."); 

    if(NetworkService.front_cs.getServer_handler() != null) { 
     Log.d("SERVICENET", "IF Block Sign OFF reached."); 
     LinkedList<String> list = new LinkedList<String>(); 
     list.add(NetworkService.myConfig.getEmail()); 
     NetworkService.front_cs.getServer_handler().sendMessage(new UniversalContainerMessage(ppa.utils.Constants.CS_GOING_OFFLINE_OPCODE,list)); 
    } 

} 
@Override 
public void onCreate() { 

    Log.d("SERVICENET", "Service creation started."); 

    super.onCreate(); 

    path = getExternalFilesDir(null).getAbsolutePath().toString() + "/"; // TODO erzeugt manchmal nullpointer? 


    initNetwork(); 

    if (MAIN_ACTIVITY != null) { 
     MAIN_ACTIVITY.showMessages(Consts.SERVICE_STARTED); 
    } 

} 



private void initNetwork() { 

    String fullname = null; 
    String email = null; 
    boolean cfgBuildSuccess = true; 



    serverConnectionTimer = 0; 
    timer = new HashedWheelTimer(); 
    timer.newTimeout(new TimedChecksAndroid(), ppa.utils.Constants.CHATCLIENT_CHECK_INTERVAL, TimeUnit.MILLISECONDS); 
    //schedular = new SchedularDialog(this, false, myConfig, front_cs); 

} 

public String getPath() { 
    return path; 
} 

public static void setMainActivity(PPAClientActivity activity) { 
     MAIN_ACTIVITY = activity; 
    } 

}

+0

您是否使用任何启动服务的广播接收器? – Elad92

+6

如果您从您的活动和服务中发布代码,我们可以为您提供帮助;-) – FoamyGuy

+0

我编辑了我的帖子并添加了重要的代码部分,但如果事端缺失请告诉我 – sMau

有两种方法来启动/停止服务。

  1. 服务以Context.startService()开始。要停止此类服务,您的活动应拨打stopService()或服务本身应拨打stopSelf()
  2. 服务始于Context.bindService()。停止绑定服务全部您的活动bindService()应拨打unbindService()

当你开始通过方法1 onStartCommand()方法在你的服务的服务将被调用,因为你没有说我假设你正在使用的第二个方法。如果是这种情况,我的猜测是要么不是所有的活动都叫做unbindService(),要么是在服务停止之后有一个叫做bindService的活动。

您可能想要检查Service API以查看如何启动/停止服务的示例。