我有一个定时器,可以在结束时启动通知。但我只想在应用程序当前不可见的情况下使用notificationManager触发通知,并在应用程序处于前台时计时器结束时显示alertDialog。
我已经尝试过了:
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;
}
}
}
但看起来这个应用程序是前台还是非前台并不重要。我该怎么做呢?
发布于 2011-07-28 00:35:22
您可以通过以下方式检测您的应用程序是否可见:
在您的所有Activity
中,设置:
@Override
protected void onResume() {
super.onResume();
myVisibilityManager.setIsVisible(true);
}
@Override
protected void onPause() {
myVisibilityManager.setIsVisible(false);
super.onPause();
}
(这可能会导致您为实现此行为的所有活动定义一个超类)
然后创建一个VisibilityManager
(这是非常基础的,你可能需要更高级的东西):
public class VisibilityManager {
private boolean mIsVisible = false;
public void setIsVisible(boolean visible) {
mIsVisible = visible;
}
public boolean getIsVisible() {
return mIsVisible;
}
}
然后,在你的计时器线程中,当倒计时到零时:
if (VisibilityManager.getIsVisible()) {
showAlertDialog();
}
else {
showNotification();
}
编辑:但我甚至更喜欢本页面中描述的CommonsWare方法。它更优雅。
发布于 2011-07-27 23:54:53
在这种情况下,我建议您使用Service而不是activity。
服务在后台运行,如果正确启动,则不受活动生命周期的影响。
需要记住的一件重要事情是,当您返回到UI时,服务必须显式地调用UI线程,否则您将获得ANR错误,因为UI线程不是threadsafe。
请通读该文档,它将帮助您获得更好的解决方案!
希望这能有所帮助
发布于 2016-06-04 18:36:00
以下是解决方案:
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");
}
编辑:如果你想检查特定的活动(类),使用这个;
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;
}
}
在您的清单文件中:
<activity android:name=".PINSayfasi"
android:process=":PIN"></activity>
因此,主要的逻辑是打开和阅读过程。
https://stackoverflow.com/questions/6847337
复制相似问题