Android 阻止活动在后台做某事
我得到了以下场景: 我正在写一个应用程序,它就像一个聊天客户端。它在启动时连接到服务器并侦听消息(网络事务由服务处理)。 我的问题是在注销几秒钟后(相关方法向服务器发送信号,然后停止服务并调用finish()),应用程序似乎没有做任何事情就再次登录(我可以在服务器日志中看到这一点)。我不知道如何处理这个问题,我的意思是阻止我的应用程序在后台再次登录。 登录方法由在我的主活动的onCreate方法中创建的服务调用。我对android还不是很熟悉,我希望任何人都能给我一个提示。 提前谢谢 问候,, 斯茅 编辑以添加代码: 我在logcat中发现,我收到一条消息,如“计划在xxxx毫秒内重新启动崩溃的服务” initNetwork方法和timer类被缩短,只有非常多的network stuff id不希望由于自动服务重启而自动执行Android 阻止活动在后台做某事,android,service,background-process,android-activity,Android,Service,Background Process,Android Activity,我得到了以下场景: 我正在写一个应用程序,它就像一个聊天客户端。它在启动时连接到服务器并侦听消息(网络事务由服务处理)。 我的问题是在注销几秒钟后(相关方法向服务器发送信号,然后停止服务并调用finish()),应用程序似乎没有做任何事情就再次登录(我可以在服务器日志中看到这一点)。我不知道如何处理这个问题,我的意思是阻止我的应用程序在后台再次登录。 登录方法由在我的主活动的onCreate方法中创建的服务调用。我对android还不是很熟悉,我希望任何人都能给我一个提示。 提前谢谢 问候,,
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;
}
公共类NetworkService扩展服务{
公共静态字符串路径;
静态ClientUserConfig myConfig;
私钥;
静态前端\u CS前端\u CS;
静态前端控制前端控制;
公共静态布尔runOnce=true;
私有字符串服务器\u ip=“10.0.2.2”;
私有静态PPAClientActivity主活动;
私有int-serverConnectionTimer;
私有hashedweeltimer;
private final LinkedList chatWindows=新建LinkedList();
类TimedChecksAndroid实现TimerTask{
公共无效运行(超时tmt){
字符串senderEmail;
字符串senderFullname;
链接列表;
int选择;
int chatNum;
ClientUserEntry用户;
如果(服务器连接计时器>=60){
}
@凌驾
公共IBinder onBind(意向){
//TODO自动生成的方法存根
返回null;
}
@凌驾
公共空间{
super.ondestory();
关闭服务();
if(主活动!=null){
主活动。显示消息(常量服务已停止);
}
}
私有网络关闭服务(){
Log.d(“SERVICENET”,“已关闭”);
if(NetworkService.front\u cs.getServer\u handler()!=null){
日志d(“SERVICENET”,“如果达到阻止签核”);
LinkedList=新建LinkedList();
添加(NetworkService.myConfig.getEmail());
NetworkService.front_cs.getServer_handler().sendMessage(新的UniversalContainerMessage(ppa.utils.Constants.cs_GOING_OFFLINE_操作码,列表));
}
}
@凌驾
public void onCreate(){
Log.d(“SERVICENET”,“服务创建已开始”);
super.onCreate();
path=getExternalFilesDir(null).getAbsolutePath().toString()+“/”;//TODO erzeugt manchmal nullpointer?
initNetwork();
if(主活动!=null){
主活动。显示消息(常量服务已启动);
}
}
专用网络(){
字符串fullname=null;
字符串email=null;
布尔值cfgBuildSuccess=true;
serverConnectionTimer=0;
计时器=新的HashedWheelTimer();
timer.newTimeout(new timedchecksaroid(),ppa.utils.Constants.CHATCLIENT\u CHECK\u INTERVAL,TimeUnit.ms);
//schedular=新的SchedularDialog(this,false,myConfig,front_cs);
}
公共字符串getPath(){
返回路径;
}
公共静态无效setMainActivity(PPAClientActivity活动){
主要活动=活动;
}
}启动/停止服务有两种方法
Context.startService()
启动。要停止此类服务,您的活动应该调用stopService()
,或者服务本身应该调用stopSelf()
Context.bindService()
启动。要停止绑定服务所有调用bindService()
的活动应调用unbindService()
onStartCommand()
方法,因为您没有该方法,所以我假设您使用的是第二种方法。如果是这种情况,我猜不是所有活动都调用了unbindService()
或有一个活动在服务停止后调用了bindService
您可能需要查看示例以了解如何启动/停止服务。您是否使用了启动服务的广播接收器?如果您发布活动和服务中的代码,我们更有可能帮助您;-)我编辑了我的帖子并添加了重要的代码部分,但如果缺少某些内容,请告诉我