当前位置: 首页 > 知识库问答 >
问题:

Android应用程序,活动状态(运行,不运行,前台/后台)

闾丘谦
2023-03-14

我遇到了一个需求,但我无法获得正确的实施方式,因此需要您的帮助。

我想做什么我想根据收到的通知执行以下操作:

  1. 当应用程序处于打开状态且处于前台(即用户可见)且我收到通知时,我只需显示一个弹出窗口即可开始我的活动B

我做了什么?我已经达到了第1点和第2点。我想达到第三点。我试过下面的方法

public static boolean isApplicationBroughtToBackground(final Activity activity) {
  ActivityManager activityManager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
  List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(1);

  // Check the top Activity against the list of Activities contained in the Application's package.
  if (!tasks.isEmpty()) {
    ComponentName topActivity = tasks.get(0).topActivity;
    try {
      PackageInfo pi = activity.getPackageManager().getPackageInfo(activity.getPackageName(), PackageManager.GET_ACTIVITIES);
      for (ActivityInfo activityInfo : pi.activities) {
        if(topActivity.getClassName().equals(activityInfo.name)) {
          return false;
        }
      }
    } catch( PackageManager.NameNotFoundException e) {
      return false; // Never happens.
    }
  }
  return true;
}

然而,在这两种情况下,点#2和#3都返回true,所以我不能仅区分#3。

我也尝试了下面的每一个活动,

@Override
protected void onPause() {
    super.onPause();
    saveIsPausedInPref(true);
}

@Override
protected void onResume() {
    super.onResume();
    saveIsPausedInPref(false);
}   

但是,它也不会给出所需的结果,因为如果应用程序被发送到后台按下主页按钮我的首选项将有isPause=true,如果用户从最近删除应用程序,那么它将保持真实,再次我将无法当通知到达时,区分点#2和#3。

很抱歉,但我希望我能解释我的要求。

提前感谢。:)

编辑:

        <activity
            android:name=".HomeActivity"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".ChatProfileActivity"
            android:screenOrientation="portrait" >
        </activity>

共有3个答案

冯野
2023-03-14

我知道你想出了一个办法

>

这应该是正确的方式,如果它在前台,然后通过eventbus发布事件,eventbus是我首选的方式。

卓宏达
2023-03-14

要区分案例2和案例3,可以执行以下操作:

如果不是案例1,则启动活动B。在ActivityB.onCreate()中执行以下操作:

super.onCreate(...);
if (isTaskRoot()) {
    // ActivityB has been started when the app is not running,
    //  start the app from the beginning
    Intent restartIntent = new Intent(this, MyRootActivity.class);
    startActivity(restartIntent);
    finish();
    return;
}
... rest of onCreate() code here...

章翔宇
2023-03-14

下面的代码适合我

在AndroidManifest.xml中

<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:name=".MyApplication"
            >

MyApplication.java

public class MyApplication extends Application {
private ActivityLifecycleCallbacks myLifecycleHandler;

@Override
    public void onCreate() {
        super.onCreate();
        myLifecycleHandler=new MyLifecycleHandler();
        registerActivityLifecycleCallbacks(myLifecycleHandler);
    }
}

andler.java

public class MyLifecycleHandler implements Application.ActivityLifecycleCallbacks {
    private static final String TAG = MyLifecycleHandler.class.getSimpleName();

private static int resumed;
private static int paused;
private static int started;
private static int stopped;

@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}

@Override
public void onActivityDestroyed(Activity activity) {
}

@Override
public void onActivityResumed(Activity activity) {
    ++resumed;
}

@Override
public void onActivityPaused(Activity activity) {
    ++paused;
    Log.d(TAG, "application is in foreground: " + (resumed > paused));
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}

@Override
public void onActivityStarted(Activity activity) {
    ++started;
}

@Override
public void onActivityStopped(Activity activity) {
    ++stopped;
    Log.d(TAG, "application is visible: " + (started > stopped));
}

public static boolean isApplicationVisible() {
    return started > stopped;
}

public static boolean isApplicationInForeground() {
    return resumed > paused;
}
}

现在使用myLifeycleHandler方法,您可以获得所需的所有状态。

I应用信息再研磨方法-

isApplication可见的意思是-

如果isApplication ationInForeground为真,则isApplication ationVisight将始终为真,反之亦然

 类似资料:
  • 我有一个运行秒表服务的应用程序,我在前台运行该服务 我有一个显示计时器的通知,它每秒都会更新 在我离开应用程序30秒后,通知停止更新,我发现原因是我的设备的电池优化: 在我的应用程序的系统设置中,有一个电池优化部分,其中包含一个名为的设置,可以打开或关闭 我发现两个线程(回答线程1和回答线程2)试图回答如何检查设置的状态,它们都建议使用<但对我来说,这并不管用。无论设置是打开还是关闭,此函数都返回

  • 程序运行状态 对于用户程序而言,中断的处理应当是不留任何痕迹的:只要中断处理改动了一个寄存器,都可能导致原本正在运行的线程出现错误。因此,在处理中断之前,必须要保存所有可能被修改的寄存器,并且在处理完成后恢复。因此,我们需要保存所有通用寄存器,sepc、scause 和 stval 这三个会被硬件自动写入的 CSR 寄存器,以及 sstatus。因为中断可能会涉及到权限的切换,以及中断的开关,这些

  • 我正在处理活动识别API,试图使其在后台运行。因此,我创建了一个连接到Play Services的服务,并且一直处于活动状态。当服务被销毁并重新创建时,我要干杯了。问题是,一段时间后,即使服务正在运行,它也会停止检测活动。 下面是该服务的一些代码。 我还覆盖了onConnectionSuspend 这段代码正常工作了一段时间,然后突然停止了。有人知道为什么吗? 谢谢。

  • 我有一个简单的java程序,它只是一段代码,可以从数据库中读取并根据某些条件修改数据库的内容。现在,我想要的是这个程序应该在启动时自动启动并在后台静默运行,除非有人从任务管理器中杀死它。我以前从未做过这样的事情,也不知道具体该怎么做。有人能帮我解决这个问题吗?谢谢你...

  • 例如。 这应该运行一个简单的hello world应用程序,摘自oracle文档。然而,当我‘运行’这个代码,没有窗口打开。取而代之的是打开一个名为“Java”的应用程序。看起来'java'只是一个位于'jdk1.8.0_25.jdk/contents/home/bin'中的'UNIX可执行文件‘。应用程序'java'绝对不显示任何东西,并且在没有强制退出的情况下无法关闭。 我在MacBook上运

  • 问题内容: 我想从Java代码运行另一个应用程序。 进程已启动,但在后台运行。如何使其在前台运行? 问题答案: 您应该告诉cmd.exe您希望它在新窗口中打开: