单击退出后应用程序保持打开状态?怎么了?

Posted

技术标签:

【中文标题】单击退出后应用程序保持打开状态?怎么了?【英文标题】:App remains open after clicking exit? what is wrong? 【发布时间】:2018-05-13 14:18:06 【问题描述】:

今天我将一个 google play services 库更新为一个更新版本的应用程序。 Eclipse 没有给我任何类型的错误,我编译了它,当我在手机上测试时工作正常,然后我转到菜单并选择退出并确认以关闭它,应用程序从屏幕上消失。 但是当你点击手机底部的方块时(当你列出所有打开的应用程序时),应用程序仍然在运行! o_O

在更新之前,应用程序关闭正常,现在退出后仍保持活动状态。但我不认为gps会导致这种问题。有什么建议???

这是我的 MainActivity.java(执行退出菜单过程的地方)

package com.myapp.radio;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.media.AudioManager;
import android.os.Bundle;
import android.os.IBinder;
import android.view.Menu;
import android.view.MenuItem;
import com.myapp.radio.R;

public class BaseActivity extends Activity 

private Intent bindIntent;
private Radioservice radioService;

private static boolean isExitMenuClicked;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    isExitMenuClicked = false;

    // Bind to the service
    bindIntent = new Intent(this, RadioService.class);
    bindService(bindIntent, radioConnection, Context.BIND_AUTO_CREATE);

    setVolumeControlStream(AudioManager.STREAM_MUSIC);


@Override
protected void onResume() 
    super.onResume();
    if (isExitMenuClicked == true)
        finish();


@Override
public boolean onCreateOptionsMenu(Menu menu) 
    getMenuInflater().inflate(R.menu.main_menu, menu);

    if (radioService.getTotalStationNumber() <= 1) 
    
    return true;


@Override
public boolean onOptionsItemSelected(MenuItem item) 
    Intent i;

    final String thisClassName = this.getClass().getName();
    final String thisPackageName = this.getPackageName();

    if (item.getItemId() == R.id.radio) 
        if (!thisClassName.equals(thisPackageName + ".MainActivity")) 
            i = new Intent(this, MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);
            return true;
        

     else if (item.getItemId() == R.id.exit) 
        String title = "Cerrar aplicación";
        String message = "¿Realmente desea salir?";
        String buttonYesString = "Si";
        String buttonNoString = "No";

        isExitMenuClicked = true;

        AlertDialog.Builder ad = new AlertDialog.Builder(this);
        ad.setTitle(title);
        ad.setMessage(message);
        ad.setCancelable(true);
        ad.setPositiveButton(buttonYesString,
                new DialogInterface.OnClickListener() 
                    @Override
                    public void onClick(DialogInterface dialog, int which) 

                        if (radioService != null) 
                            radioService.exitNotification();
                            radioService.stop();
                            radioService.stopService(bindIntent);
                            isExitMenuClicked = true;
                            finish();
                        
                    
                );

        ad.setNegativeButton(buttonNoString, null);

        ad.show();

        return true;

     else if (item.getItemId() == R.id.about) 
        if (!thisClassName.equals(thisPackageName + ".AboutActivity")) 
            i = new Intent(this, AboutActivity.class);
            startActivity(i);
            return true;
        

     else if (item.getItemId() == R.id.facebook) 
        if (!thisClassName.equals(thisPackageName + ".FacebookActivity")) 
            i = new Intent(this, FacebookActivity.class);
            startActivity(i);
            return true;
        
     else if (item.getItemId() == R.id.twitter) 
        if (!thisClassName.equals(thisPackageName + ".TwitterActivity")) 
            i = new Intent(this, TwitterActivity.class);
            startActivity(i);
            return true;
        
    
    return super.onOptionsItemSelected(item);


// Handles the connection between the service and activity
private final ServiceConnection radioConnection = new ServiceConnection() 
    @Override
    public void onServiceConnected(ComponentName className, IBinder service) 
        radioService = ((RadioService.RadioBinder) service).getService();
    

    @Override
    public void onServiceDisconnected(ComponentName className) 
        radioService = null;
    
;

protected void onCreate1(Bundle savedInstanceState) 
    // TODO Auto-generated method stub




【问题讨论】:

这是 Android 的正常行为。操作系统可能会选择在您关闭应用程序后将其保留在内存中。不同的设备和不同的 Android 版本在这方面可能表现出不同的行为。 错字,当我的意思是 MainActivity 实际上是 BaseActivity.java @ScottKronheim 有没有办法摆脱它并强制关闭?您可以从用户手机关闭应用的唯一方法是查看正在运行的进程并强制保留或按正方形并单击应用右上角的 X。 没有办法强制你想要的行为。 Android 不能那样工作。 @ScottKronheim 实际上我刚才测试了两个应用程序.. 一个旧的应用程序发布了我的我和其他用户在 playstore 的应用程序。在退出后两者都保持打开状态,老实说,这是我第一次看到这个。我怀疑我的应用程序有插页式广告,如果它在退出后仍保持在后台打开,则在执行其他任务时不时会在用户手机中弹出广告。在后台运行的应用的插页式广告。 【参考方案1】:

此行为与 Google Play 服务无关,这是 Android 的工作原理。

当您离开任何应用程序时,它仍然存在一段时间。没有任何正在运行的活动,但应用程序实例处于活动状态。如果您在短时间内再次启动它 - 它启动得非常快,因为一些应用程序数据继承自上次运行。例如,所有静态变量——它们仍然存在并且包含以前的值。它可能会在重新启动的应用程序中导致非常复杂的错误,因此请注意这一点!

额外的生存时间取决于当前条件。如果有足够的内存 - 它更长,不够 - 更快地被杀死。

【讨论】:

感谢谢尔盖的解释!退出后处于“活动模式”时弹出的广告,可以通过任何方式解决吗?导致应用程序认为它正在运行并从后台启动插页式广告。 o_O @unarea,正如我之前写的,没有任何活动的活动,但一些背景工作可能正在进行中。因此,如果您不希望它们显示任何新 UI,则应在退出前明确停止所有工作任务。停止方法可能会有所不同,具体取决于您的实际处理:线程、异步任务、处理程序、服务......从您的问题中不清楚谁在运行事后弹出窗口。 通常,广告网络(例如 AdMob)禁止随机展示插页式广告。直接被网络封号!因此,根据通用规则,广告应该显示为对某些用户操作(例如按下某个按钮)的反应。也许您需要修改与广告相关的应用行为...

以上是关于单击退出后应用程序保持打开状态?怎么了?的主要内容,如果未能解决你的问题,请参考以下文章

您应该让 Redis 保持打开状态,还是在每次在节点中使用后打开并退出它?

如何启动 Outlook 处于最小化状态

如何使用引导程序让单击的导航药丸保持活动状态?

发送消息后保持 textarea 处于活动状态

如何通过单击按钮禁用 JQuery 功能,但默认保持打开状态?

vue手机项目,账户退出后登录页面总保持这样?怎么解决?