Android跨進程通信——Activity

在Android應用開發中,會用到跨進程通信的方式,什麼是跨進程通信,例如,在第三方應用中調用撥號、短信、郵件等,在這個過程中發生數據的傳遞,當前應用(一個進程)調用另一個應用(第二個進程),這就是Android中的跨進程通信。在Android中,一共有四種跨進程通信的方式,分別是通過Activity、BroadcastReceiver、ContentProvider和AIDL(Android Interface Definition Language),今天主要簡述一下通過Activity來實現在一個進程中調用另一個進程並傳遞數據的實現。
首先新建一個工程,命名為ProjectTwo,這個工程為接收來自第一個進程消息的工程。然後到Mainifest.xml中修改Activity配置:
[html]
<activity 
            android:name=".ProjectTwoActivity" 
            android:label="@string/app_name" > 
            <intent-filter> 
                <action android:name="com.ryan.test.MYACTION" /> 
                <data android:scheme="info"/> 
                <category android:name="android.intent.category.DEFAULT" /> 
            </intent-filter> 
        </activity> 
其中的action標簽指定瞭該Activity接收的動作,data標簽定義的是訪問協議,category用默認方式DEFAULT。

然後到Activity中獲取從第一個工程傳過來的數據:
[java] 
public class ProjectTwoActivity extends Activity { 
     
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
         
        TextView valueTextView = (TextView) this.findViewById(R.id.tv_value); 
         
        //getData方法獲取的是傳過來的URI 
        if (getIntent().getData() != null) { 
            //獲取從第一個進程中傳遞過來的數據 
            String value = getIntent().getExtras().getString("value"); 
            System.out.println("—-"+value); 
            valueTextView.setText(value); 
        } 
    } 

然後新建一個工程命名為ProjectOne,在Activity中編寫代碼如下:
[java]
public class ProjectOneActivity extends Activity { 
    //調用另外一個進程中Activity的Action 
    private static final String ACTION = "com.ryan.test.MYACTION"; 
     
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
         
        Button invokeButton = (Button) this.findViewById(R.id.btn_invoke); 
        invokeButton.setOnClickListener(new OnClickListener() { 
             
            @Override 
            public void onClick(View v) { 
                //URI定義瞭通信協議 
                Uri uri = Uri.parse("info://test"); 
                //通過Action和URI調用第二個進程中的Activity,並傳遞數據 
                Intent invokeIntent = new Intent(ACTION,uri); 
                invokeIntent.putExtra("value", "Data from project one"); 
                startActivity(invokeIntent); 
            } 
        }); 
    } 

先運行ProjectTwo到設備上,然後運行ProjectOne,點擊按鈕後就將數據從進程1(ProjectOne)傳遞到瞭進程2(ProjectTwo),到此,就完成瞭通過Activity在兩個進程間進行通信的方式。另外,這裡使用的是startActivity,還可以使用startActivityForResult方法進行值回調。

運行效果:
            

 

             


You May Also Like