RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 670896
Accepted
Evgeniy
Evgeniy
Asked:2020-05-26 03:09:40 +0000 UTC2020-05-26 03:09:40 +0000 UTC 2020-05-26 03:09:40 +0000 UTC

查明活动是否正在从服务运行

  • 772

如果活动正在运行,我如何从服务中找出并根据此显示/不显示通知?

android
  • 4 4 个回答
  • 10 Views

4 个回答

  • Voted
  1. Best Answer
    eugeneek
    2020-05-26T18:35:44Z2020-05-26T18:35:44Z

    创建自己的类Application,在其中实现接口Application.ActivityLifecycleCallbacks并注册为侦听器。在其中,您可以跟踪打开或关闭了哪些活动:

    public class MyApplication extends Application 
            implements Application.ActivityLifecycleCallbacks {
    
        private int activityCount = 0;
    
        @Override
        public void onCreate() {
            super.onCreate();    
            registerActivityLifecycleCallbacks(this);
        }
    
        public boolean isAppForeground() {
            return activityCount > 0;
        }
    
        @Override
        public void onActivityStopped(Activity activity) {
    
        }
    
        @Override
        public void onActivityStarted(Activity activity) {
    
        }
    
        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
    
        }
    
        @Override
        public void onActivityResumed(Activity activity) {
            activityCount++;
        }
    
        @Override
        public void onActivityPaused(Activity activity) {
            activityCount--;
        }
    
        @Override
        public void onActivityDestroyed(Activity activity) {
    
        }
    
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    
        }
    }
    

    并且在必要的时候,获取服务中的应用,检查应用是否打开:

    ((MyApplication) getApplicationContext()).isAppForeground();
    

    不要忘记在清单中声明您的应用程序类:

    <application
            android:name=".MyApplication"
            ...
    >
    ....
    </application>
    

    如果您只需要跟踪特定活动,请检查相应方法中的类类型if (activity instanceof YourTargetActivity):

    public boolean isTargetActivityStarted = false;
    
    @Override
    public void onActivityResumed(Activity activity) {
        if (activity instanceof YourTargetActivity) {
            isTargetActivityStarted = true;
        }
    }
    
    @Override
    public void onActivityPaused(Activity activity) {
        if (activity instanceof YourTargetActivity) {
            isTargetActivityStarted = false;
        }
    }
    

    在服务中检查变量:

    if (((MyApplication) getApplicationContext()).isTargetActivityStarted) {
        // Активити запущена и находится на переднем плане
    } else {
        // Активити не запущена или свёрнута
    }
    
    • 3
  2. katso
    2020-05-26T12:35:26Z2020-05-26T12:35:26Z

    有点特殊情况,但作为一种选择,您可以:

    派送服务Broadcast

    public class MessagingService extends FirebaseMessagingService {
        public static final String ACTION_FILTER = "com.exampe.EVENT";
        @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
            Intent intent = new Intent(ACTION_FILTER);
            intent.putExtra(...);
            sendOrderedBroadcast(intent, null);
        }
    }
    

    receiver低AndroidManifest.xml优先级注册

    <receiver
        android:name=".services.NotificationsReceiver"
        android:priority="0">
        <intent-filter>
            <action android:name="com.exampe.EVENT" />
        </intent-filter>
    </receiver>
    

    它发送一个通知

    在Activity以高优先级注册,OnResume()注册。receiverOnPause()

    IntentFilter intentFilter = new IntentFilter(MessagingService.ACTION_FILTER);
    intentFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
    registerReceiver(broadcastReceiver, intentFilter);
    

    在这个receiver'e中做你在Activity跑步时需要做的事

    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //do something
            abortBroadcast(); //отменяет дальнейшую обработку бродкаста
        }
    };
    
    • 0
  3. Evgen Orlovsky
    2020-05-26T18:51:28Z2020-05-26T18:51:28Z

    服务可以通过 Notification 发送通知

    示例代码 - 来自我的项目:

    public void sendMessage(int countNews){
        Resources resources = getResources();
        Intent i = NewsListActivity.newIntent(this);
        PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0);
    
        Resources res = getApplicationContext().getResources();
    
        Notification notification = new NotificationCompat.Builder(this)
                .setTicker(resources.getString(R.string.get_new_news))
                .setSmallIcon(R.drawable.ic_notif_logo)
                .setLargeIcon(BitmapFactory.decodeResource(res, R.mipmap.ic_launcher))
                .setNumber(countNews)
                .setContentTitle(resources.getString(R.string.get_new_news))
                .setContentText(resources.getQuantityString(R.plurals.news_plurals, countNews, countNews))
                .setContentIntent(pi)
                .setAutoCancel(true)
                .build();
    
        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
        notificationManager.notify(0, notification);
    }
    

    意图包含单击通知时将启动的活动。

    • 0
  4. Arty Morris
    2022-04-23T17:30:45Z2022-04-23T17:30:45Z

    不难判断一个activity是否在屏幕上运行

    @Override
    public void onPause() {
        super.onPause();
        _show_form = false;
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        _show_form = false;
    }
    
    @Override
    protected void onStart() {
        super.onStart();
        _show_form = true;
    }
    
    @Override
    protected void onResume () {
        super.onResume();
        _show_form = true;
    }
    
    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5