어떻게 하면 안드로이드 응용 프로그램을 활성화시킬 수 있습니까?

1. 루틴 프로세스 응용
  • 기본적으로 같은 응용 프로그램의 모든 구성 요소가 같은 프로세스에서 실행됩니다.물론 manfest 목록 파일에서 구성 요소가 실행하는 프로세스를 설정할 수도 있습니다.
    구성 요소 요소activity, 서비스,receiver,provider, 모두 하나의 프로세스 속성으로 구성 요소가 어느 프로세스에서 실행되는지 지정할 수 있습니다.이 속성은 모든 구성 요소가 자신의 프로세스에서 실행되거나, 프로세스의 이름이 다른 구성 요소와 하나의 프로세스를 공유하도록 설정할 수 있습니다.
  • 안드로이드는 메모리가 적고 다른 프로세스가 메모리를 더 필요로 할 때, 프로세스가 닫히고, 프로세스의 구성 요소들이 모두 삭제될 때 프로세스를 닫기로 결정합니다. 이 구성 요소들이 다시 필요할 때 프로세스가 생성됩니다.
  • 시스템은 각 구성 요소의 실례에 대해 각각 라인을 만들지 않습니다.하나의 프로세스에서 실행되는 모든 구성 요소는 주 루틴 (UI 루틴) 에서 실례화되고, 시스템은 모든 구성 요소에 대한 호출을 이 루틴에서 발송하며, UI 루틴에서만 당신의 인터페이스를 관리할 수 있습니다.
  • 스레드 프로세스를 적용할 수 있습니다. 예를 들면 다음과 같습니다.
    스레드(Thread): 냉각 라인, 프로세스(process): 작업장, 응용프로그램: 플랜트
  • 왜 다중 스레드를 사용합니까?
    루틴은 하나의 유수선과 같다. 우리가 네트워크 연결이나 데이터베이스 요청 같은 시간 소모 조작을 실행하면 이 루틴이 막힐 수 있다.또한 기본 스레드(UI 스레드)에서 전체 인터페이스에 응답해야 합니다.따라서 UI 스레드를 차단하지 않고 애플리케이션 성능을 향상시키려면 멀티 스레드가 필요합니다.
  • 왜 다중 프로세스를 사용합니까?
    Android 시스템에서는 각 프로세스에 대해 메모리 제한이 있습니다.만약 한 응용 프로그램이 여러 프로세스를 할 수 있다면, 이 응용 프로그램은 더 많은 메모리를 가지고 실행할 수 있으며, 우리의 응용 메모리 제한을 확대하고 프로그램의 속도를 최적화시킬 수 있다.

  • 2. 프로세스의 등급(프로세스의 생명주기)
    하나.프로세스는 우선 순위에 따라 다른 레벨로 나뉘어져 있습니다.
  • 프론트 데스크톱 프로세스(Foreground process):
    A.           Activity( onResume()  )
    
    B.    bound        Activity
    
    C.   “  ”    Service(startForeground()   )
    
    D.              Service(onCreate()、onStart()   onDestroy())
    
    E.     onReceive()     BroadcastReceiver    
    
    (         ,             。)
    
  • 가시 프로세스(Visible process): 이 프로세스는 맨 앞에 있지 않고 초점을 받지 못하지만 우리는 그것들을 볼 수 있다.
    A.       、         Activity(          Activity)
    
    B.        (     )  Activity   Service
    
  • 서비스 프로세스(서비스 프로세스):
    A.         startService()    ,               Service
    
  • 백그라운드 프로세스(Background process):
    A.       Activity  
    
  • 빈 프로세스(Empty process):
    A.              ,                ,                    ,          。
    
  • 프로세스 등급 판단 원칙: 여러 등급의 프로세스 상태가 존재할 때 우선순위가 높은 프로세스를 고려한다.

  • 3. 프로세스 회수 메커니즘: Low Memory Killer
  • 안드로이드 시스템에서 사용자가 프로그램을 종료한 후에도 프로그램의 프로세스가 시스템에 존재하여 프로그램의 재시작에 편리하다.
  • 그러나 열린 프로그램의 수가 증가함에 따라 시스템 메모리가 부족해지기 때문에 일부 프로그램의 프로세스를 죽여 메모리 공간을 확보해야 한다.
  • 어떤 프로세스를 죽여야 하는지에 대해 Low Memory Killer 메커니즘을 통해 판정한다.
  • Low Memory Killer는 프로세스를 통한 oomadj와 메모리를 차지하는 크기가 죽일 프로세스를 결정합니다.oomadj는 작을수록 죽기 힘들어.
  • 시스템 메모리 임계값과 그에 대응하는 1조oomadj값, 시스템의 남은 메모리가 메모리 임계값의 한 범위 내에 있을 때 프로세스의oomadj값이 이 임계값에 대응하는 oom 보다 크다adj값이면 프로세스가 죽습니다.

  • 4. 진행 과정의 살해 방지
  • 경량화 프로세스: Low Memory Killer의 프로세스를 죽이는 규칙에 따라 서비스로 하여금 백그라운드에서 비교적 적은 일을 하고 메모리 자원을 제때에 방출하도록 해야 한다.
  • 서비스를 이용하여 프로세스 권한을 향상시킵니다. startForeground 방법을 호출하여 서비스를'프론트 데스크톱 프로세스'로 설정합니다. 그러면 Notification 알림을 보내야 합니다.
          :
    
        1.  Android 4.3  ,          Notification             Notification。
    
        2.  Android 4.3  ,          Notification。         : 
                    Service   startForeground       ,          ID Notification  ,        Notification。      Service      ,         。     Service      Service,        。
    
  • 응용 프로그램 탭에android:persistent="true"
     androidmanifest.xml  application     android:persistent="true"                      LMK  ,          。               ,                。        apk     /system/app   。             。
    
  • 추가
    5. 피살 후 재가동
  • 서비스 메커니즘을 이용하여 리셋: 안드로이드 시스템이 서비스를 설계할 때 onStartCommand 방법에서 서로 다른 값을 되돌려 시스템에 알리고 시스템이 메모리 부족으로 인해 죽은 후에 자원이 부족하지 않을 때 리셋할 수 있도록 한다.
    START_NOT_STICKY
         onStartCommand()            ,         Intent  ,           。
    
    START_STICKY
         onStartCommand()          ,                onStartCommand()  ,            Intent  ,      null Intent     onStartCommand()  。
          ,         Intent         。               (      ),                  。
    
    START_REDELIVER_INTENT
         onStartCommand()     ,             ,              Intent     onStartCommand()  。      Intent        。                      ,     。
    
    이 경우 시스템을 재부팅할 수 있지만 즉시 재부팅할 수는 없습니다.또한 일부 맞춤형 ROM에서는 유효하지 않습니다.
  • 이중 프로세스 수호: AB 두 개의 서로 다른 프로세스를 설계한다. A 프로세스에서 B 프로세스가 살아남았는지 돌아가며 검사하고 살아남지 않으면 끌어당긴다. 마찬가지로 B 프로세스에서 A 프로세스가 살아남았는지 돌아가며 검사하고 살아남지 않으면 끌어당긴다. 백엔드 논리는 어느 프로세스에서 마음대로 실행하면 된다.
    
    
    
    두 개의 프로세스를 사용하여 각각 두 개의 서비스를 마운트하고 두 개의 서비스는 서로 폴링하여 깨운다.
    public class FirService extends Service {
    
        public final static String TAG = "com.example.servicedemo.FirService";
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.e(TAG, "onStartCommand");
    
            thread.start();
            return START_STICKY;
        }
    
        Thread thread = new Thread(new Runnable() {
    
            @Override
            public void run() {
                Timer timer = new Timer();
                TimerTask task = new TimerTask() {
    
                    @Override
                    public void run() {
                        Log.e(TAG, "FirService Run: "+System.currentTimeMillis());
                        boolean b = Util.isServiceWorked(FirService.this, "com.example.servicedemo.SecService");
                        if(!b) {
                            Intent service = new Intent(FirService.this, SecService.class);
                            startService(service);
                            Log.e(TAG, "Start SecService");
                        }
                    }
                };
                timer.schedule(task, 0, 1000);
            }
        });
    
        @Override
        public IBinder onBind(Intent arg0) {
            return null;
        }
    
    }
    
    
    
    --------------------------------------
    
    public class SecService extends Service {
    
        public final static String TAG = "com.example.servicedemo.SecService";
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.e(TAG, "onStartCommand");
    
            thread.start();
            return START_REDELIVER_INTENT;
        }
    
        Thread thread = new Thread(new Runnable() {
    
            @Override
            public void run() {
                Timer timer = new Timer();
                TimerTask task = new TimerTask() {
    
                    @Override
                    public void run() {
                        Log.e(TAG, "SecService Run: " + System.currentTimeMillis());
                        boolean b = Util.isServiceWorked(SecService.this, "com.example.servicedemo.FirService");
                        if(!b) {
                            Intent service = new Intent(ServiceTwo.this, FirService.class);
                            startService(service);
                        }
                    }
                };
                timer.schedule(task, 0, 1000);
            }
        });
    
        @Override
        public IBinder onBind(Intent arg0) {
            return null;
        }
    
    }
    
    
    -----------------------------------
    
    public class Util {
    
        public static boolean isServiceWorked(Context context, String serviceName) {
            ActivityManager myManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            ArrayList runningService = (ArrayList) myManager.getRunningServices(Integer.MAX_VALUE);
            for (int i = 0; i < runningService.size(); i++) {
                if (runningService.get(i).service.getClassName().toString().equals(serviceName)) {
                    return true;
                }
            }
            return false;
        }
    
    
    }
    
  • 정적 방송 수신기를 이용하여 프로세스를 다시 시작합니다. 정적 등록된 방송 수신기BroadcastReceiver를 사용하여 일부 시스템 방송/기타 응용 프로그램이 보내는 방송이 onReceive에서 프로세스를 다시 시작하는 것을 감청합니다.
           ?:
    
    1.  Android 3.1  ,  stopped              。
    2.                  ,            ,             (stopped state)。
    3.       stopped           ,   intent   FLAG_INCLUDE_STOPPED_PACKAGES  Flag。     ,           。
    4.                  。
    5.     ROM     STOPPED  
    
  • 시스템 서비스와 묶음: Notification Listener Service Notification Listener Service는 시스템을 통해 조정된 서비스로 응용 프로그램이 알림을 발동할 때 알림의 동작과 정보를 Notification Listener 서비스로 되돌려줍니다.
    
    
        
            
        
    
    
    
    -------------------
    
    public class NotificationService extends NotificationListenerService {
    
      @Override
      public void onNotificationPosted(StatusBarNotification sbn) {
    
    
      }
    
      @Override
      public void onNotificationRemoved(StatusBarNotification sbn) {
    
    
      }
    
    }
    
    시스템에서 어떤 응용 프로그램이 알림을 보내거나 사용자가 알림을 삭제하는 것을 발견하면 이 서비스의 상기 두 함수를 되돌려줍니다. 함수의 매개 변수인 StatusBarNotification은 이 알림의 구체적인 정보를 포함합니다.
  • 기타: 가족통/SDK 깨우기, 휴대전화 제조업체의 화이트리스트 맞춤형
  • 6. Android 응용 프로그램의 활성화 균형
  • 프로세스는 사용자 체험으로 돌아가야 한다.어떤 프로세스는 성능 최적화를 하지 못하고 오히려 끊임없이 전기를 재부팅하거나 유령처럼 사용자 앞에 반복적으로 나타난다.어떤 응용 장면에서 어떤 프로세스가 활성화되는 것은 응당한 역할을 한다. 예를 들어 음악이 재생될 때의 프론트 데스크톱 서비스 등이다.
  • 깡패들의 진행 보수는 안드로이드 생태 환경을 망치고 안드로이드 플랫폼 개발자 등의 이익을 해칠 뿐이다.물론 Google은 이러한 비열한 방법으로 나쁜 짓을 저지르게 하지는 않을 것입니다.

  • 참조:
    http://blog.csdn.net/aigestudio/article/details/51348408 http://www.jianshu.com/p/63aafe3c12af http://www.cnblogs.com/angeldevil/archive/2013/05/21/3090872.html …

    좋은 웹페이지 즐겨찾기