Android開發筆記——android:process=”:remote”

來源:互聯網
上載者:User

由於每個應用程式都運行在自己的進程空間,並且可以從應用程式UI運行另一個服務進程,而且經常會在不同的進程間傳遞對象。在Android平台,一個進程通常不能訪問另一個進程的記憶體空間,所以要想對話,需要將對象分解成作業系統可以理解的基本單元,並且有序的通過進程邊界。  通過代碼來實現這個資料轉送過程是冗長乏味的,Android提供了AIDL工具來處理這項工作。

這裡通過與鬧鐘執行個體來實現這一機制的簡單實現:

鬧鐘設定的實現是通過AlarmManager來實現的,AlarmManager提供系統警示器服務,AlarmManager就會通過onReceive方法來執行這個事件,而將事件傳給onReceive就是通過註冊 ,然後利用android:process=":remote這一機制來實現的。

[java] 
    </activity> 
    <receiver android:name=".AlarnReceiver" android:process=":remote"/> 
</application> 
而android:process=":remote意思就是說你配的這個組件會在另外一個進程中運行,這裡面另一個就是pendingIntent,pendingIntent是一種特殊的Intent。主要的區別在於Intent的執行立刻的,而pendingIntent的執行不是立刻的。pendingIntent執行的操作實質上是參數傳進來的Intent的操作,但是使用pendingIntent的目的在於它所包含的Intent的操作的執行是需要滿足某些條件的。

下面是鬧鐘簡單源碼:

[java] 
public class MainActivity extends Activity 

    Button  mButton1; 
    Button  mButton2; 
     
    TextView mTextView; 
     
    Calendar calendar; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstanceState); 
         
        setContentView(R.layout.activity_main); 
        /* 執行個體模式 */ 
        calendar=Calendar.getInstance(); 
         
        mTextView=(TextView)findViewById(R.id.text); 
        mButton1=(Button)findViewById(R.id.set); 
        mButton2=(Button)findViewById(R.id.cancle); 
         
        mButton1.setOnClickListener(new View.OnClickListener() 
        { 
          public void onClick(View v) 
          { 
              //擷取目前時間 
            calendar.setTimeInMillis(System.currentTimeMillis()); 
            int mHour=calendar.get(Calendar.HOUR_OF_DAY); 
            int mMinute=calendar.get(Calendar.MINUTE); 
            new TimePickerDialog(MainActivity.this, 
              new TimePickerDialog.OnTimeSetListener() 
              {                 
                public void onTimeSet(TimePicker view,int hourOfDay,int minute) 
                { 
                  calendar.setTimeInMillis(System.currentTimeMillis()); 
                  calendar.set(Calendar.HOUR_OF_DAY,hourOfDay); 
                  calendar.set(Calendar.MINUTE,minute); 
                  calendar.set(Calendar.SECOND,0); 
                  calendar.set(Calendar.MILLISECOND,0); 
                  /* 建立Intent和PendingIntent,來調用目標組件 */ 
                  Intent intent = new Intent(MainActivity.this, AlarnReceiver.class); 
               /*從系統取得一個用於向BroadcastReceiver的Intent廣播的PendingIntent對象*/    
                  PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this,0, intent, 0); 
                  AlarmManager am; 
                  /* 擷取鬧鐘管理的執行個體 */ 
                  am = (AlarmManager)getSystemService(ALARM_SERVICE); 
                  /* 設定鬧鐘 */ 
                  am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
                  /* 設定周期鬧 */ 
                  am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10*1000), (24*60*60*1000), pendingIntent);  
                  String tmpS="設定鬧鐘時間為"+format(hourOfDay)+":"+format(minute); 
                  mTextView.setText(tmpS); 
                }           
              },mHour,mMinute,true).show(); 
          } 
        }); 
         
        mButton2.setOnClickListener(new View.OnClickListener() 
        { 
          public void onClick(View v) 
          { 
            Intent intent = new Intent(MainActivity.this, AlarnReceiver.class); 
            PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this,0, intent, 0); 
            AlarmManager am; 
            /* 擷取鬧鐘管理的執行個體 */ 
            am =(AlarmManager)getSystemService(ALARM_SERVICE); 
            /* 取消 */ 
            am.cancel(pendingIntent); 
            mTextView.setText("鬧鐘已取消!"); 
          } 
        }); 
    }        
    /* 格式化字串(7:3->07:03) */ 
    private String format(int x) 
    { 
        String s = "" + x; 
        if (s.length() == 1) 
            s = "0" + s; 
        return s; 
    } 

這裡簡單實現功能就是到達我們設定的特定時間,就會通知onReceive方法來提示鬧鐘提示!而這前提就是開闢的另一個線程!

下面是另一個類的實現:

[java] 
public class AlarnReceiver extends BroadcastReceiver 

 
    @Override 
    public void onReceive(Context arg0, Intent arg1) 
    { 
        // TODO Auto-generated method stub 
        Toast.makeText(arg0, "你設定的鬧鐘時間到了", Toast.LENGTH_LONG).show(); 
    } 
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.