首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何知道我的android应用程序是否可见?

如何知道我的android应用程序是否可见?
EN

Stack Overflow用户
提问于 2011-07-27 23:49:12
回答 3查看 15.3K关注 0票数 18

我有一个定时器,可以在结束时启动通知。但我只想在应用程序当前不可见的情况下使用notificationManager触发通知,并在应用程序处于前台时计时器结束时显示alertDialog。

我已经尝试过了:

代码语言:javascript
复制
ActivityManager actMngr = (ActivityManager) ValeoMobileApplication.getContext().getSystemService(Activity.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningAppProcesses = actMngr.getRunningAppProcesses();
Tools.log("TimerBroadcastReceiver", "onReceive", "All running processes are listed below :");
for (RunningAppProcessInfo pi : runningAppProcesses) {
    //Check pi.processName and do your stuff
    //also check pi importance - check if process is in foreground or background
    Tools.log("TimerBroadcastReceiver", "onReceive", pi.processName + " importance = "+pi.importance);
    if(pi.processName.equalsIgnoreCase("MY_APP_PROCESS_NAME")){
        if (pi.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
            isApplicationInForeground = true;
        }
    }
}

但看起来这个应用程序是前台还是非前台并不重要。我该怎么做呢?

EN

回答 3

Stack Overflow用户

发布于 2011-07-28 00:35:22

您可以通过以下方式检测您的应用程序是否可见:

在您的所有Activity中,设置:

代码语言:javascript
复制
@Override
protected void onResume() {
    super.onResume();

    myVisibilityManager.setIsVisible(true);
}

@Override
protected void onPause() {
    myVisibilityManager.setIsVisible(false);

    super.onPause();
}

(这可能会导致您为实现此行为的所有活动定义一个超类)

然后创建一个VisibilityManager (这是非常基础的,你可能需要更高级的东西):

代码语言:javascript
复制
public class VisibilityManager {
    private boolean mIsVisible = false;

    public void setIsVisible(boolean visible) { 
         mIsVisible = visible; 
    }

    public boolean getIsVisible() {
         return mIsVisible;
    }
}

然后,在你的计时器线程中,当倒计时到零时:

代码语言:javascript
复制
if (VisibilityManager.getIsVisible()) {
    showAlertDialog();
}
else {
    showNotification();
}

编辑:但我甚至更喜欢本页面中描述的CommonsWare方法。它更优雅。

票数 11
EN

Stack Overflow用户

发布于 2011-07-27 23:54:53

在这种情况下,我建议您使用Service而不是activity。

服务在后台运行,如果正确启动,则不受活动生命周期的影响。

需要记住的一件重要事情是,当您返回到UI时,服务必须显式地调用UI线程,否则您将获得ANR错误,因为UI线程不是threadsafe。

请通读该文档,它将帮助您获得更好的解决方案!

希望这能有所帮助

票数 0
EN

Stack Overflow用户

发布于 2016-06-04 18:36:00

以下是解决方案:

代码语言:javascript
复制
public static boolean uygulamaCalisiyormu(Context context)
    {
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> islemler = activityManager.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo uygulamaIslemi : islemler)
        {
            if (uygulamaIslemi.processName.equals(context.getPackageName()))
            {
                if (uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE || uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND)
                {
                    return true;
                }
            }
        }
        return false;
    }


...
 if (uygulamaCalisiyormu(getApplicationContext()))
        {
            Log.d("asd","App Already Started");
        }
      else
        {
Log.d("asd","App Started");
}

编辑:如果你想检查特定的活动(类),使用这个;

代码语言:javascript
复制
  if (uygulamaIslemi.processName.equals("com.TRSoft.timetab:PIN"))
            {
                if (uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE || uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) // Lanet olasıca şey Visible ile Foreground arasındaki fark ne oç illaha ya da yı kullanarak olduğunu keşfetmem mi lazım!
                {
                    return true;
                }
            }

在您的清单文件中:

代码语言:javascript
复制
 <activity android:name=".PINSayfasi"
            android:process=":PIN"></activity>

因此,主要的逻辑是打开和阅读过程。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6847337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档