我得到了以下场景:
我正在写一个应用程序,它就像一个聊天客户端。它在启动时连接到服务器并监听消息(网络事务由服务处理)。
我的问题是在注销几秒钟后(相关方法向服务器发送一个信号,然后停止服务并调用finish()),应用程序似乎在不做任何事情的情况下重新登录(我可以在服务器日志中看到这一点)。我不知道如何处理这个问题,我的意思是阻止我的应用程序再次在后台登录。
登录方法由在主活动的oncreate方法中创建的服务调用。我还不太熟悉android,我希望有人能给我一个提示。
提前谢谢。
当做,
SMAU
编辑以添加代码:
我在logcat中看到一条消息,比如“安排在xxxx ms内重启崩溃的服务”
initnetwork方法和timer类被缩短,只有非常多的network stuff 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;
}
}
最佳答案
有两种方法可以启动/停止服务。
服务从Context.startService()
开始。要停止这样的服务,您的活动应该调用stopService()
或服务本身应该调用stopSelf()
。
服务从Context.bindService()
开始。要停止绑定服务,所有调用bindService()
的活动都应该调用unbindService()
。
当您通过方法1启动服务时,您的服务中的onStartCommand()
方法将被调用,因为您没有这个方法,所以我假设您正在使用第二个方法。如果是这样的话,我猜可能不是所有的活动都调用了unbindService()
或者在服务停止后有一个活动调用了bindService
。
您可能需要检查Service API以获取如何启动/停止服务的示例。
关于android - 防止 Activity 在后台做某事,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8973655/