吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2677|回复: 5
收起左侧

[其他转载] 通知栏监控程序

[复制链接]
516234141 发表于 2020-6-1 14:03
作为独立开发者申请不到微信支付宝支付怎么办?网上找了下解决方案,最终发现监听通知栏消息来发起支付回调最简单。
下面我就简单说一下实现过程,第一次发帖,有不足的地方勿怪{:1_893:} 。


1.使用AndroidStudio创建一个Android工程


2.创建两个Service,一个是通知栏监听服务继承于NotificationListenerService,一个是GuardService守护服务。

创建守护服务原因是当Android内存紧张时会根据进程优先级来杀掉一些服务,守护服务和监听服务相互绑定,如果其中一个服务停止了就重新启动,这样来提高了服务的生存率。
public int onStartCommand(Intent intent, int flags, int startId) {
    notifyManager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    Util.startForeground(this,1,"MyNotifyService","MyNotifyService.Name","监听服务","正在监听通知栏");
    bindService(new Intent(this,GuardService.class),mServiceConnection, Context.BIND_IMPORTANT);
    //打开通知测试
    StartTestNotify();
    return START_STICKY;
}


private ServiceConnection mServiceConnection=new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {

    }
    @Override
    public void onServiceDisconnected(ComponentName name) {
        //连接断开,重新绑定
        Intent intent=new Intent(MyNotifyService.this,GuardService.class);
        intent.setAction("android.intent.action.RESPOND_VIA_MESSAGE");
        ComponentName comName=Util.startServer(MyNotifyService.this,MyNotifyService.class);
    }
};


把服务设置为前台运行,提高进程优先级
static void startForeground(Service service, int id, String CHANNEL_ONE_ID, String CHANNEL_ONE_NAME, String title, String content){
    Notification.Builder builder=new Notification.Builder(service)
            .setContentTitle(title)
            .setContentText(content)
            .setTicker(content);
    //修改安卓8.1以上系统报错
    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
        NotificationChannel notificationChannel=new NotificationChannel(CHANNEL_ONE_ID,CHANNEL_ONE_NAME, NotificationManager.IMPORTANCE_MIN);
        notificationChannel.enableLights(false);//如果使用中的设备支持通知灯,则说明此通知通道是否应显示灯
        notificationChannel.setShowBadge(false);//是否显示角标
        notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
        NotificationManager  manager=(NotificationManager) service.getSystemService(Context.NOTIFICATION_SERVICE);
        assert manager != null;
        manager.createNotificationChannel(notificationChannel);
        builder.setChannelId(CHANNEL_ONE_ID);
    }
    Notification notification=builder.build();
    service.startForeground(id,notification);
}


3.在onNotificationPosted里面监听通知栏消息
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
    Notification notification=sbn.getNotification();
    try {
        //有些通知不能解析出TEXT内容,这里做个信息能判断
        if (notification.tickerText != null) {
            String nMessage = notification.tickerText.toString();
            ReceiveMessage(nMessage,sbn);
        }
    } catch (Exception e) {
        Debug.LogError(e.toString());
    }
}

private void ReceiveMessage(String msg,StatusBarNotification sbn){
    //移除当前这个通知
    notifyManager.cancel(sbn.getTag(),sbn.getId());
    //是否读取到测试通知消息
    if(msg.equals(MyNotify.CONTENT)){
        if(state== LisNotifyState.unOpen){
            state= LisNotifyState.running;
            //开启服务
            Message mm=new Message();
            mm.obj= (Action) ()->GED.get().Notify("lisServiceStart",true);
            toMainThread.sendMessage(mm);
        }
        state= LisNotifyState.running;
        isReadNotify=true;
        return;
    }
    GED.get().Notify("lisServiceMsg",msg);
}
到这一步基础功能就完成了,代码也很简单。

4.为了判断监听服务是否正常运行每个几秒就自己发一条通知
//打开通知测试
private void StartTestNotify(){
    if(myNotify!=null)
        return;
    myNotify=new MyNotify();
    Context context=this;
    exitThread=false;
    new Thread(()->{
        try {
            while (!exitThread){
                isReadNotify=false;
                myNotify.SendNotify(context);
                if (state== LisNotifyState.running){
                    Thread.sleep(3000);
                    if(!isReadNotify){
                        //服务运行后没有读取到测试通知消息
                        //关闭测试通知线程
                        exitThread=false;
                        state= LisNotifyState.stop;
                        myNotify=null;
                        GED.get().Notify("lisServiceState",state);
                        break;
                    }else {
                        //服务正常运行
                        Message msg=new Message();
                        msg.obj= LisNotifyState.running;
                    }
                } else {
                    Thread.sleep(1000);
                }
                GED.get().Notify("lisServiceState",state);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }).start();
}




MyNotify
public void SendNotify(Context context){
    Notification.Builder builder=new Notification.Builder(context)
            .setContentTitle("Test")
            .setContentText("Content")
            .setSmallIcon(R.mipmap.ic_launcher)
            .setTicker("TestNotify");

    NotificationManager manager=(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    if(manager==null){
        Debug.LogError("NotificationManager 获取错误!");
        return;
    }
    //修改安卓8.1以上系统报错
    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
        NotificationChannel notificationChannel=new NotificationChannel(CHANNEL_ONE_ID,CHANNEL_ONE_NAME, NotificationManager.IMPORTANCE_MIN);
        notificationChannel.enableLights(false);//如果使用中的设备支持通知灯,则说明此通知通道是否应显示灯
        notificationChannel.setShowBadge(false);//是否显示角标
        notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
        manager.createNotificationChannel(notificationChannel);
        builder.setChannelId(CHANNEL_ONE_ID);
    }
    Notification notification=builder.build();
    manager.notify(2,notification);
}


最后还需要做的功能:
1.每过几秒通知后台服务是否正常运行
2.获取到的支付通知交由后台处理
3.支付宝或者位置生成收款二维码个后台
4.后台调用正常运行服务端手机端支付二维码给用户支付






发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

巅烽2 发表于 2020-6-1 21:01
完整的例子有没有
努力的小七 发表于 2020-6-1 22:22
wushaominkk 发表于 2020-6-2 09:25
守护进程早就已经失效了,现在唯一可以申请后台运行权限和电池优化白名单+一些灰色保活套路
 楼主| 516234141 发表于 2020-6-2 10:41
wushaominkk 发表于 2020-6-2 09:25
守护进程早就已经失效了,现在唯一可以申请后台运行权限和电池优化白名单+一些灰色保活套路

看android版本,8.0以上的确实有问题,我用的6.0手机测试的。
也可以直接刷成系统级的程序,不过不能大规模使用,自己玩玩还可以
吾非故渊 发表于 2021-5-6 22:15
能否发 源文件呢;
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 17:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表