<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      安卓筆記俠

      專注安卓開發

      導航

      Android IPC機制(一)開啟多進程

      1. 為何要開啟多進程
      為何開啟android應用要開啟多進程,主要有以下幾點:

      單進程所分配的內存不夠,需要更多的內存。在早期android系統只為一個單進程的應用分配了16M的可用內存,隨著手機的硬件的提升和android系統的改進,雖然可分配內存越來越多,但仍舊可以通過開啟多進程來獲取更多的內存來處理自己App的業務

      獨立運行的組件,比如個推,它的服務會另開一個進程。

      運行一些”不可見人”的操作,比如獲取用戶的隱私數據,比如雙守護進程來防止被用戶殺掉

      2. 開啟多進程
      首先我們寫一個Activity并啟動一個service

      public class MyProcessActivity extends AppCompatActivity {
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_my_process);
              Intent myServiceIntent=new Intent(MyProcessActivity.this,MyService.class);
              this.startService(myServiceIntent);
          }
      }
      

      service的代碼:

      public class MyService extends Service {
      
          private static final String TAG = "wangshu";
          @Override
          public void onCreate() {
              Log.i(TAG,"MyService is oncreate");
          }
      
          @Override
          public int onStartCommand(Intent intent, int flags, int startId) {
              Log.i(TAG, "MyProcessActivity is created: ");
              return START_STICKY;
          }
          @Override
          public void onDestroy() {
              Log.i(TAG,"OnDestory");
          }
          @Override
          public IBinder onBind(Intent arg0) {
              return null;
          }
      
      }
      

      最后我們只需要在AndroidManifest.xml中的配置 android:process就可以了

      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.liuwangshu.myprogress" >
      
          <application
              android:allowBackup="true"
              android:name=".MyApplication"
              android:icon="@mipmap/ic_launcher"
              android:label="@string/app_name"
              android:supportsRtl="true"
              android:theme="@style/AppTheme" >
              <activity android:name=".MyProcessActivity" >
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN" />
                      <category android:name="android.intent.category.LAUNCHER" />
                  </intent-filter>
              </activity>
              <service
                  android:name=".MyService"
                  android:label="@string/app_name"
                  android:process=":remote">
              </service>
          </application>
      </manifest>
      

      這里選擇“remote”這個名字是隨意主觀的,你也可以取其他的名字。冒號“:”則代替當前應用的包名,所以MyService跑在進程名為“com.example.liuwangshu.myprogress:remote”的進程中。我們也可以設置 android:process=”com.example.liuwangshu.myprogress.remote”,這樣MyService跑在進程名為“com.example.liuwangshu.myprogress.remote”的進程中。這兩種命名也是有區別的,如果被設置的進程名是以一個冒號開頭的,則這個新的進程對于這個應用來說是私有的,當它被需要或者這個服務需要在新進程中運行的時候,這個新進程將會被創建。如果這個進程的名字是以小寫字符開頭的,則這個服務將運行在一個以這個名字命名的全局的進程中,當然前提是它有相應的權限。這將允許在不同應用中的各種組件可以共享一個進程,從而減少資源的占用。

      我們運行應用則發現:開啟了兩個進程 
      這里寫圖片描述

      3. 開啟多進程引出的問題
      開啟多進程會使Application運行兩次,我們繼承Application,在oncreate方法中打log并運行程序

      public class MyApplication extends Application {
          private static final String TAG = "wangshu";
          @Override
          public void onCreate() {
              super.onCreate();
              int pid = android.os.Process.myPid();
              Log.i(TAG, "MyApplication is oncreate====="+"pid="+pid);
      }
      

      這里寫圖片描述

      在log中我們發現我們開啟的兩個進程都會執行oncreate方法。現在很多開發者都習慣在Application中做初始化操作以及數據的傳遞操作,這顯然是不妥當的,解決的方法就是得到每個進程的名稱,如果進程的名稱和我們應用的進程名稱相同則做我們應用的操作,如果不是則做其他進程的操作

      public class MyApplication extends Application {
          private static final String TAG = "wangshu";
          @Override
          public void onCreate() {
              super.onCreate();
              int pid = android.os.Process.myPid();
              Log.i(TAG, "MyApplication is oncreate====="+"pid="+pid);
              String processNameString = "";
              ActivityManager mActivityManager = (ActivityManager)this.getSystemService(getApplicationContext().ACTIVITY_SERVICE);
              for (ActivityManager.RunningAppProcessInfo appProcess : mActivityManager.getRunningAppProcesses()) {
                  if (appProcess.pid == pid) {
                      processNameString = appProcess.processName;
                  }
              }
              if("com.example.liuwangshu.myprogress".equals(processNameString)){
                  Log.i(TAG, "processName="+processNameString+"-----work");
              }else{
                  Log.i(TAG, "processName="+processNameString+"-----work");
              }
          }
      }
      

      這里寫圖片描述

      從Log中可以看到不同的進程執行了不同的操作

        

        

      posted on 2018-07-10 09:54  安卓筆記俠  閱讀(1001)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 亚洲国产精品一区二区久| 国产av熟女一区二区三区| 亚洲精品自拍在线视频| 一区二区三区午夜无码视频| 久久婷婷五月综合97色直播| 亚洲乱熟乱熟女一区二区| 国产中文字幕日韩精品| 久久精品熟女亚洲av艳妇| www亚洲精品| 国产无遮挡又黄又大又爽| 亚洲国产精品乱码一区二区| 亚洲综合在线日韩av| 久久国产精品波多野结衣| 熟女性饥渴一区二区三区| 无码日韩精品一区二区三区免费| 国产高清在线精品一本大道| 午夜DY888国产精品影院| 日本黄页网站免费大全| 中文字幕av一区| 精品国产免费一区二区三区香蕉| 欧美日韩一区二区三区视频播放| 97超级碰碰碰久久久久| 日韩熟妇中文色在线视频| 任我爽精品视频在线播放| 人妻少妇久久久久久97人妻| 久久一级黄色大片免费观看| 亚洲AV日韩AV综合在线观看 | 亚洲人成网7777777国产| 美女内射福利大全在线看| 精品国产粉嫩一区二区三区| 久久不卡精品| 老司机亚洲精品一区二区| 偷拍视频一区二区三区四区| 免费午夜无码片在线观看影院 | 国产成人精品亚洲午夜麻豆| 亚洲国产成熟视频在线多多| 久久99日韩国产精品久久99| 久久夜色精品亚洲国产av| a男人的天堂久久a毛片| 五月天天天综合精品无码| 亚洲av成人一区二区|