阻止活动在后台执行某些操作
问题描述:
我得到了以下场景: 我正在编写一个应用程序,它的作用类似于聊天客户端。它在启动时连接到服务器并正在侦听消息(网络事物由服务处理)。 我的问题是签字后几秒钟(有关的方法发送一个信号到服务器,然后停止服务和调用完成()),应用程序似乎再次登录没有做任何事情(我可以看到这在服务器日志)。我不知道如何处理这个问题,我的意思是阻止我的应用程序在后台再次登录。 方法登录被在我的主要活动的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;
}
}
答
有两种方法来启动/停止服务。
- 服务以
Context.startService()
开始。要停止此类服务,您的活动应拨打stopService()
或服务本身应拨打stopSelf()
。 - 服务始于
Context.bindService()
。停止绑定服务全部您的活动bindService()
应拨打unbindService()
。
当你开始通过方法1 onStartCommand()
方法在你的服务的服务将被调用,因为你没有说我假设你正在使用的第二个方法。如果是这种情况,我的猜测是要么不是所有的活动都叫做unbindService()
,要么是在服务停止之后有一个叫做bindService
的活动。
您可能想要检查Service API以查看如何启动/停止服务的示例。
您是否使用任何启动服务的广播接收器? – Elad92
如果您从您的活动和服务中发布代码,我们可以为您提供帮助;-) – FoamyGuy
我编辑了我的帖子并添加了重要的代码部分,但如果事端缺失请告诉我 – sMau