• Service和启动其他应用的功能和替换Fragment


    Service后台奔溃

    1.启动

            Intent intent = new Intent(this, SpotLightService.class);
            this.startService(intent); //这个普通启动会在低内存的时候被杀掉
            //普通的启动修改成前台启动
            this.startForegroundService(intent);
    
    • 1
    • 2
    • 3
    • 4

    2.修改SERVICE

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            int startResult = super.onStartCommand(intent,flags,startId);
            startForeground();
            return START_STICKY;
        }
    
        private void startForeground() {
            final NotificationManager noMan = getSystemService(NotificationManager.class);
            noMan.createNotificationChannel(new NotificationChannel(
                    NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_ID,
                    NotificationManager.IMPORTANCE_DEFAULT));
            //Log.d(TAG, "Starting foreground. myUid=" + Process.myUid());
            startForeground(NOTIFICATION_ID,
                    new Notification.Builder(this,NOTIFICATION_CHANNEL_I
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    根据包名启动应用

        public boolean startAPPFromPackageName( String pckName) {
            if (pckName.equals("acr.browser.lightning.activity.MainActivity") || pckName.equals("com.android.bthsrv.MainActivity")) {
                Intent intent = new Intent().setComponent(new ComponentName("com.viso.mdm" , pckName) );
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);
                sContext.startActivity(intent);
            }
    
            try {
                Intent intent = isexit(pckName);
                if (intent == null) {
    
                }
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);
                sContext.startActivity(intent);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }
       public Intent isexit(String pk_name) {
            PackageManager packageManager = sContext.getPackageManager();
            Intent it = packageManager.getLaunchIntentForPackage(pk_name);
            return it;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    其中从最近任务栏进入wps如果不经过特殊处理则不能进入

            //判断是否为WPS,如果是WPS应用,通过任务ID启动,否则当有多个WPS任务时,会导致WPS报错
            if ("cn.wps.moffice_eng".equals(bean.getPackageName())) {
                ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
                manager.moveTaskToFront(bean.getId(), ActivityManager.MOVE_TASK_WITH_HOME);
            } else {
                mRecentTaskHelper.startAppByClassName(this, bean.getPackageName(), bean.getClassName());
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    //获取最近任务栏应用
    
    List<ActivityManager.RecentTaskInfo> appTasks = activityManager.getRecentTasks(Integer.MAX_VALUE, ActivityManager.RECENT_IGNORE_UNAVAILABLE);
                        if (appTasks == null || appTasks.size() == 0) {
                            emitter.onNext(taskList);
                            return;
                        }
                                            for (ActivityManager.RecentTaskInfo taskInfo : appTasks) {
                            ResolveInfo resolveInfo = packageManager.resolveActivity(taskInfo.baseIntent, 0);
                            String packageName = resolveInfo.activityInfo.packageName;
                            //过滤不需要的应用
                            if (!isNotShowApp(mContext, packageName)) {
                                TaskBean bean = new TaskBean();
                                bean.setName(resolveInfo.loadLabel(
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    System.currentTimeMillis()的时间会有误差,如果时区不同会造成误差,所以使用SystemClock.elapsedRealtime();是比较准确的做法

    ** 替换FragmentManager **

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.right_fragment, fragment);
    transaction.addToBackStack(null);
    transaction.commit();
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    RadiAnt DICOM Viewer 2022.1 Crack
    如何免费将XPS转换为PDF格式
    黑白简约个人网页制作 大学生个人网页设计模板 学生个人博客网页成品 简单个人网站作品下载 静态HTML CSS个人网页作业源代码
    证件照尺寸怎么修改?这三个好用的方法你知道吗?
    xavier安装torch-gpu
    Xcode 15 运行<iOS 14, 启动崩溃问题
    反射获取类属性(含父类中的属性)
    云呐|固定资产管理系统功能包括哪些?
    程序设计与算法(三)C++面向对象程序设计笔记 第五周 继承
    精智达在科创板过会:拟募资6亿元,2022年前三季度收入约3亿元
  • 原文地址:https://blog.csdn.net/weixin_46362658/article/details/133749212