通知未与应用程序 android 关闭?

Posted

技术标签:

【中文标题】通知未与应用程序 android 关闭?【英文标题】:Notification is not closing with app android? 【发布时间】:2016-12-27 05:15:41 【问题描述】:

我以RadioPlayerService为例在android中创建广播流

我已添加以下代码以退出 RadioActivity.java

@Override
    public void onBackPressed() 

        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle("Exit ! Radio App.");
        alertDialogBuilder
                .setMessage("Click Yes to Exit!")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() 
                            public void onClick(DialogInterface dialog, int id) 
                                moveTaskToBack(true);
                                android.os.Process.killProcess(android.os.Process.myPid());
                                System.exit(0);

                            
                        )

                .setNegativeButton("No", new DialogInterface.OnClickListener() 
                    public void onClick(DialogInterface dialog, int id) 

                        dialog.cancel();
                    
                );

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();

    

这里我的应用程序正在退出,但通知正在运行 this 是我的通知类

谁能建议我如何在退出时杀死整个应用程序

或者结合通知服务和主要活动,这样我就可以完全退出应用程序

This是完整的参考代码

有人可以推荐我吗

更新 1

我在主要活动中提供退出选项,而不是在其他服务中 我的主要活动是RadioActivity.java,我的服务是RadioPlayerService.java

所以在这里我要退出主要活动,所以我需要的意思是而不是退出主要活动它应该退出整个应用程序,包括服务。

不要在没有评论的情况下投反对票不要在没有看到完整的源代码的情况下发表评论..

再次感谢

【问题讨论】:

您的意思是,当您从活动返回时,您想清除所有通知并停止播放? 是的,换句话说,当应用程序退出或关闭时它的退出或强制关闭通知 android.os.Process.killProcess(android.os.Process.myPid()); System.exit(0); 不是关闭活动的好方法 ok @MaňishYadav 你能建议我如何退出整个应用程序,包括通知 感谢 Manish Yadav,您的代码运行良好,但媒体播放器没有关闭,但添加后它退出了所有内容 mRadioManager .disconnect(); 【参考方案1】:

你用过System.exit(0);,建议你不要用。使用它不是一种好的编程风格。有一个方法叫finish();

您无需调用System.exit(0) 来终止Activity,只需Activity.finish()

关闭应用程序

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);

您可以将您的活动设置为单个实例,以便在您调用设备的任何地方都可以从堆栈中返回相同的活动。

在 Manifest.xml 中

" ... android:launchMode="singleInstance">

为避免Intent 调用同一Activity 的多个实例,请从Intent 中删除FLAG_ACTIVITY_NEW_TASK 标志并添加FLAG_ACTIVITY_CLEAR_TOP 一个。

来自文档:

FLAG_ACTIVITY_CLEAR_TOP 如果设置,并且正在启动的活动是 已经在当前任务中运行,而不是启动一个新的 该活动的实例,其之上的所有其他活动 将被关闭,这个 Intent 将被传递到(现在在顶部) 旧 Activity 作为新 Intent。

FLAG_ACTIVITY_NEW_TASK 如果设置,此活动将成为此历史堆栈上新任务的开始。


清除所有通知

NotificationManager nMgr = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nMgr.cancelAll();

更新1

@Override
public void onBackPressed() 

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
    alertDialogBuilder.setTitle("Exit ! Radio App.");
    alertDialogBuilder
            .setMessage("Click Yes to Exit!")
            .setCancelable(false)
            .setPositiveButton("Yes",
                    new DialogInterface.OnClickListener() 
                        public void onClick(DialogInterface dialog, int id) 

                            mRadioManager .disconnect();// after adding this its also closed radio player
                            NotificationManager nMgr = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                            nMgr.cancelAll();
                            Intent homeIntent = new Intent(Intent.ACTION_MAIN);
                            homeIntent.addCategory( Intent.CATEGORY_HOME );
                            homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(homeIntent);

                        
                    )

            .setNegativeButton("No", new DialogInterface.OnClickListener() 
                public void onClick(DialogInterface dialog, int id) 

                    dialog.cancel();
                
            );

    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();


【讨论】:

实际上我正在为主要活动本身提供退出选项 radioactivty.java 你能更新你的答案吗 @Don'tBenegative 请检查我更新的完整解决方案,这可能会有所帮助。如果你还有prb,那么在这里评论:-) #soReadyToHelp 请不要投反对票 感谢@Manish Yadav 先生......您的代码运行良好,但收音机播放器没有关闭,但添加后它退出了所有东西 mRadioManager .disconnect();【参考方案2】:

所以基本上你可以做的是,当你在对话框上单击“是”时,你应该通过调用 finish() 来终止你的活动,并且你必须停止你的服务,或者如果它被你的活动绑定,你可以避免调用stopService,当你的activity被调用Finish()销毁时它会自动解除绑定,检查下面的代码

   AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle("Exit ! Radio App.");
        alertDialogBuilder
                .setMessage("Click Yes to Exit!")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() 
                            public void onClick(DialogInterface dialog, int id) 
                                moveTaskToBack(true);
                                //this will unbind the radioservice
                                mRadioManager.disconnect();
                                finish();

                            
                        )

                .setNegativeButton("No", new DialogInterface.OnClickListener() 
                    public void onClick(DialogInterface dialog, int id) 

                        dialog.cancel();
                    
                );

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();

在您的 RadioPlayerService 中,覆盖 onDestroy 方法并调用公共方法 stopFromNotification() 方法

【讨论】:

这里是 your_service_action in intent 我的通知是 this 你能更新你的答案吗 @Don'tBenegative 能否在 RadioActivity 中告诉我,您是如何启动 RadioService 的,或者您能否粘贴 RadioActivity 的链接。我会相应地更新:) 请查看广播服务在库中的完整代码,但在我的代码中,我结合了查看完整源代码和upvote 不要在不参考的情况下投反对票 @Don'tBenegative 请检查我的答案,我在查看您共享的代码后更新了代码,我不会对任何帖子投反对票,别担心 :) @Don'tBenegative 还会覆盖 RadioService 类中的 onDestroy 并调用 stopFromNotification 方法,这将解决所有问题

以上是关于通知未与应用程序 android 关闭?的主要内容,如果未能解决你的问题,请参考以下文章

Android如何在应用程序关闭时发送通知[关闭]

关闭 Android 推送通知

在 Android 上以编程方式关闭应用程序的通知

Android:关闭通知的通知操作

当该应用的通知关闭时,在 Android 上接收 Firebase 静默通知

Android推送通知,当应用程序关闭时我会得到不同的风格