react native 的Android中,怎样设置能够让程序在未运行时能够收到通知

react-native
jpush
标签: #<Tag:0x00007fb830266a98> #<Tag:0x00007fb830266958>

(AaronHero) #1

react native 的Android中,怎样设置能够让程序在未运行时能够收到通知?


#2

(AaronHero) #3

「Android 中极光推送后台服务被杀死后不能自动重启」
android原生系统,没有 root,用 home 键上滑杀进程等其他系统自带的停止方式,都可以自启动,一般10s内恢复。但如果是强行停止就只能用户自己手动开启应用
如果是miui等第三方应用,杀了进程默认无法自启动
如果是root过的原生系统,杀了进程也是没有办法自启动的,这个时候推送是收不到的。

是不是也就是说应用在未启动时,推送后台服务是被杀死的并且不能够重启,所以是收不到通知的???


#4

如果是没有重启的话,那么是收不到的,如果重启成功就可以


(AaronHero) #5

那么程序必须打开后,才能收到通知?我用的是MIUI系统测试的


#6

起码需要进程在后台启动,且没有受到联网等的限制。具体的情况上面的总结中已说明的比较明白


(AaronHero) #7

您好,现在的情况是应用在未启动状态下,能够收到通知,但点开通知不能拉起应用运行,该怎么做哪?


#8

(AaronHero) #9
private static int isApplicationRunning(final Context context,String packageName) {
        ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(100);

        //判断程序是否在栈顶
        if (list.get(0).topActivity.getPackageName().equals(packageName)){
            return 1;
        }else {
            //判断程序是否在栈里
            for (ActivityManager.RunningTaskInfo info : list) {
                if (info.topActivity.getPackageName().equals(packageName)) {
                    return 2;
                }
            }
            return 3;
        }

    }

我用了上面的方法来判断程序在前台,还是后台,还是未启动。下面的方法在JPushInterface.ACTION_NOTIFICATION_OPENED.equals(data.getAction())中调用

if (isApplicationRunning(context,"com.reactiosjpush")==3){

                        Log.i(TAG,"程序未运行,返回值为3");
                        PackageInfo packageInfo=null;
                        packageInfo=context.getPackageManager().getPackageInfo("com.reactiosjpush",0);
                        if (packageInfo==null){
                            return;
                        }
                        // 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent
                        Intent resolveIntent=new Intent(Intent.ACTION_MAIN,null);
                        resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
                        resolveIntent.setPackage(packageInfo.packageName);

                        List<ResolveInfo>resolveInfoList=context.getPackageManager().queryIntentActivities(resolveIntent,0);
                        ResolveInfo resolveInfo=resolveInfoList.iterator().next();
                        if (resolveInfo!=null){
                            String packageName=resolveInfo.activityInfo.packageName;
                            String className = resolveInfo.activityInfo.name;
                            Intent intent1 = new Intent(Intent.ACTION_MAIN);
                            intent1.addCategory(Intent.CATEGORY_LAUNCHER);

                            ComponentName cn = new ComponentName(packageName, className);

                            intent1.setComponent(cn);
                            context.startActivity(intent1);
                        }

                    }

等于3不应该是应用未运行时调用吗?但log中显示,程序在后台点开通知时就能调用。
打印的内容: I/JPushModule: 程序未运行,返回值为3


#10

额,开发上我不能帮到你,可以看下react 针对上面的思路的讨论:


(AaronHero) #11

现在应用未启动时,发送通知时而收到,时而收不到,该应用已设置为手机的自启动应用。
收不到时会有下面的提示
Try to start application
04-20 10:14:39.067 6327-6327/com.reactiosjpush E/JPushModule: [MyReceiver]cn.jpush.android.intent.CONNECTION connected:false,怎么办?


#12

这个说明长连接断了,只有等长连接连上。

本就说了应用杀死状态下是收不到消息的,如果你能收到,说明此时他已经不是杀死状态了。


(AaronHero) #13

对于这种长连接断开的情况,该怎么处理哪


#14

没什么处理的额,等待重连,等待你App进程后台重启。


(AaronHero) #15
04-20 11:02:21.867 25954-25954/com.reactiosjpush D/JPushModule: 用户点击打开了通知
04-20 11:02:21.867 25954-25954/com.reactiosjpush W/System.err: java.lang.NullPointerException
04-20 11:02:21.867 25954-25954/com.reactiosjpush W/System.err:     at cn.jpush.reactnativejpush.JPushModule$JPushReceiver.onReceive(JPushModule.java:340)
04-20 11:02:21.867 25954-25954/com.reactiosjpush W/System.err:     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2423)
04-20 11:02:21.867 25954-25954/com.reactiosjpush W/System.err:     at android.app.ActivityThread.access$1700(ActivityThread.java:141)
04-20 11:02:21.877 25954-25954/com.reactiosjpush W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1288)
04-20 11:02:21.877 25954-25954/com.reactiosjpush W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
04-20 11:02:21.877 25954-25954/com.reactiosjpush W/System.err:     at android.os.Looper.loop(Looper.java:136)
04-20 11:02:21.877 25954-25954/com.reactiosjpush W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5052)
04-20 11:02:21.877 25954-25954/com.reactiosjpush W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
04-20 11:02:21.877 25954-25954/com.reactiosjpush W/System.err:     at java.lang.reflect.Method.invoke(Method.java:515)
04-20 11:02:21.877 25954-25954/com.reactiosjpush W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-20 11:02:21.877 25954-25954/com.reactiosjpush W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
04-20 11:02:21.877 25954-25954/com.reactiosjpush W/System.err:     at dalvik.system.NativeStart.main(Native Method)
04-20 11:02:21.877 25954-25954/com.reactiosjpush I/JPushModule: Try to start application

这个是打开通知的日志信息,怎样拉起应用并跳转界面?


#16

(AaronHero) #17

en,你发的我都看了。我把代码都换成jpush-react-native的demo代码,在应用未启动时,点开通知,不能够拉起应用


#18

那么如果你 打开手机系统的限制,自启动什么的可否解决问题?


(AaronHero) #19

自启动,允许通知什么的都设置了


(KenChoi) #20

你在点开通知的地方启动 MainActivity:

JPushModule.java

try {
                        Intent intent = new Intent();
                        intent.setClassName(context.getPackageName(), context.getPackageName() + ".MainActivity");
                        intent.putExtras(bundle);
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        context.startActivity(intent);
                    } catch (Exception e1) {
                        e1.printStackTrace();
                        Logger.i(TAG, "Cannot find MainActivity, will discard onClick event.");
                    }

常见问题 - JPush 合集(持续更新)