Windows查看进度taskList,终止进度tskill

by admin on 2019年12月4日

后天遇见了多个顺序甘休的难点:

=================================

当系统文告栏接纳到JPush远程推送音讯,并得以达成点击消息跳转钦命页面,管理推送新闻的回调函数如下:

应用程序: BussinessService.exe Framework 版本: v4.0.30319 验证:
由于未经管理的百般,进程终止。
丰富消息: System.InvalidOperationException 在……

TaskList:         列出当前具备运营进度。
        使用格局:在命令提醒符中输入tasklist
然后回车,拜访到肖似上边包车型大巴列表:
印象名称                       PID 会话名              会话#      
内部存款和储蓄器使用

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {

    NSDictionary * userInfo = response.notification.request.content.userInfo;
    UNNotificationRequest *request = response.notification.request; // 收到推送的请求
    UNNotificationContent *content = request.content; // 收到推送的消息内容
    NSNumber *badge = content.badge;  // 推送消息的角标
    NSString *body = content.body;    // 推送消息体
    UNNotificationSound *sound = content.sound;  // 推送消息的声音
    NSString *subtitle = content.subtitle;  // 推送消息的副标题
    NSString *title = content.title;  // 推送消息的标题

    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        if (userInfo) {
            [self push:userInfo];
        }else{
            return;
        }
        [JPUSHService handleRemoteNotification:userInfo];
    }
    else {
    }
    completionHandler();  // 系统要求执行这个方法
}

 意外的报错,程序自个儿并未有日记记录下来,这个时候能够到“Computer管理”——“windows日志”——依据时间及来源定位你的次第报错的日记——“详细新闻”

========================= ======== ================ ===========

System Idle Process              0 Console                    0        
28 K
System                           4 Console                    0       
328 K
smss.exe                       376 Console                    0       
500 K

Tskill:tskill
PID
        
终结有些进度,比如小编想截止上边的Maxthom,就能够那样:
Tskill 6076
        其中的6076为Maxthon的ID。

有意思味的同窗能够下载试一下那些软件和地点的授命(提示:要ALT+ENTETucson全屏才行)

     3,784 K
inetinfo.exe                  3652 Console                    0     
9,272 K

Tskill:tskill
PID
        
甘休某些进程,举个例子小编想甘休上边的Maxthom,就足以这么:
Tskill 6076
        其中的6076为Maxthon的ID。

有意思味的同桌能够下载试一下那个软件和地点的下令(提示:要ALT+ENTECR-V全屏才行)

生机勃勃、我们必要剖判有哪些跳转的情景:

1、程序在前台运营时选拔到音信
2、程序在后台运转时接到到新闻
3、程序处于终止(杀死)状态下收受到音信

那么本文保养来钻探下当程序处于终止意况下时接到到消息如哪个地区理?

不设悬念直入大旨吧,仿照QQ、Wechat等任何APP的推送机制得以精晓到,当程序被停止情状下,点击通告栏的音信只开垦app并不可能跳转特定页面,原因是appDelegate的main函数不进行,那么Push的载体导航器也不设有。系统只可以依靠布告栏所点击音讯对应远程推送注册码来抉择运维哪叁个应用程式.

据此音讯管理的逻辑即:

1、程序未被截至情状下,编写正常跳转特定页面包车型大巴代码
2、程序被甘休情况下,屏蔽Push跳转代码,只运维app就可以

图片 1

二、难点来了,进度被截止回调机制是如何吧?

1、程序进度被终止会调用此函数

// 程序进程被终止时调用
- (void)applicationWillTerminate:(UIApplication *)application{
    [[NSUserDefaults standardUserDefaults] setObject:applicationWillTerminate forKey:applicationWillTerminate];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

亟需注意:此回调函数不可能主动被调起,还索要在前后相继踏入后台的回调函数中开启UIBackgroundTaskIdentifier职责,即如下操作

2、证明全局变量

UIBackgroundTaskIdentifier _bgTask;

3、开启后台职责

- (void)applicationDidEnterBackground:(UIApplication *)application {    
    _bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        // Synchronize the cleanup call on the main thread in case
        // the task actually finishes at around the same time.
        dispatch_async(dispatch_get_main_queue(), ^{
            if (_bgTask != UIBackgroundTaskInvalid)
            {
                [[UIApplication sharedApplication] endBackgroundTask:_bgTask];
                _bgTask = UIBackgroundTaskInvalid;
            }
        });
    }];
}

能够在前后相继步入后台施行一些保留、清理操作

[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(){
//程序在10分钟内未被系统关闭或者强制关闭,则程序会调用此代码块,可以在这里做一些保存或者清理工作
NSLog(@"程序关闭");
}];

 

三、怎么着推断当前的顺序是还是不是早就被终止呢?

了然普通的BOOL或许性质记录是对事情未有什么益处的,appDelegate的代码就不进行,那么找到的减轻方案是:轻量级存款和储蓄。

1、定义常量

// 定义当前程序被终止常量
static NSString *const applicationWillTerminate = @"applicationWillTerminate";

2、记录进度被要挟停止

// 程序进程被终止时调用
- (void)applicationWillTerminate:(UIApplication *)application{
    [[NSUserDefaults standardUserDefaults] setObject:applicationWillTerminate forKey:applicationWillTerminate];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

3、当已开发银行进度时remove掉存储对象。

    [[NSUserDefaults standardUserDefaults] removeObjectForKey:applicationWillTerminate];
    [[NSUserDefaults standardUserDefaults] synchronize];
四、runtime管理推送音讯跳转特定页面源码
- (void)push:(NSDictionary *)userInfo
{
    NSDictionary *params;
    if ([[NSString stringWithFormat:@"%@",userInfo[@"aps"][@"badge"]] isEqualToString:@"1"]) {
        //邀请面试
        params = @{
                   @"class": @"InterviewTimeViewController",
                   @"property": @{
                           @"ID": @"123",
                           @"channelType": @"12"
                           }
                   };
    }else if ([[NSString stringWithFormat:@"%@",userInfo[@"extrasKey"]] isEqualToString:@"0"]){
        //查看简历状态
        params = @{
                   @"class": @"ResumeStateViewController",
                   @"property": @{
                           @"ID": @"234",
                           @"channelType": @"13"
                           }
                   };
    }

    // 类名
    NSString *classStr =[NSString stringWithFormat:@"%@", params[@"class"]];
    const char *className = [classStr cStringUsingEncoding:NSASCIIStringEncoding];

    // 从一个字串返回一个类
    Class newClass = objc_getClass(className);
    if (!newClass)
    {
        // 创建一个类
        Class superClass = [NSObject class];
        newClass = objc_allocateClassPair(superClass, className, 0);
        // 注册你创建的这个类
        objc_registerClassPair(newClass);
    }
    // 创建对象
    id instance = [[newClass alloc] init];

    // 对该对象赋值属性
    NSDictionary * propertys = params[@"property"];
    [propertys enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        // 检测这个对象是否存在该属性
        if ([self checkIsExistPropertyWithInstance:instance verifyPropertyName:key]) {
            // 利用kvc赋值
            [instance setValue:obj forKey:key];
        }
    }];

    NSString *terminate = [[NSUserDefaults standardUserDefaults] objectForKey:applicationWillTerminate];
    if (![terminate isEqualToString:applicationWillTerminate]) {
        // 获取导航控制器
        UITabBarController *tabVC = (UITabBarController *)self.window.rootViewController;
        UINavigationController *pushClassStance = (UINavigationController *)tabVC.viewControllers[tabVC.selectedIndex];
        // 跳转到对应的控制器
        [pushClassStance pushViewController:instance animated:YES];
    }
}



- (BOOL)checkIsExistPropertyWithInstance:(id)instance verifyPropertyName:(NSString *)verifyPropertyName
{
    unsigned int outCount, i;

    // 获取对象里的属性列表
    objc_property_t * properties = class_copyPropertyList([instance
                                                           class], &outCount);
    for (i = 0; i < outCount; i++) {
        objc_property_t property =properties[i];
        //  属性名转成字符串
        NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
        // 判断该属性是否存在
        if ([propertyName isEqualToString:verifyPropertyName]) {
            free(properties);
            return YES;
        }
    }
    free(properties);

    return NO;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图