兩個android程序間的相互調用(apk互調)


通常我們用到的只是activity之間的互相跳轉和調用,很少會用到apk級別的互相調用。

往往在一些應用上會用到,比如一個支付系統,可能會有很多的一系列的程序調用到:彩票系統、訂票系統、團購網……全部使用一個支付系統會顯的更加專業,也能減少不必要的重復。

下面介紹兩種方法從一個apk啟動另一個apk。

兩個互相調用的項目是:demoapk1和demoapk2

                               demoapk2是被調用的,我們調用它的Pay_Activity.java

所有的界面都是最簡單的

這是第一個demoapk1

這是demoapk2的主要activity

這是apk2點擊后跳轉到結果(同一個apk中的跳轉)

這是apk1跳轉到apk2的得到的結果(注意上方apk的title)

第一種:ComponentName()

使用ComponentName()可以跳轉到任何一個activity,不論是不是main activity。也不必寫修改被調用的apk的AndroidManifest.xml任何內容,如下:

package com.hooy.apk1;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.MotionEvent;

public class Demoapk1Activity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
         ComponentName componetName = new ComponentName(
                 //這個是另外一個應用程序的包名 
                "com.hooy.apk2",
                //這個參數是要啟動的Activity 
                "com.hooy.apk2.Pay_Activity"); 
//        Intent intent= new Intent("chroya.foo");
        Intent intent= new Intent();
        //我們給他添加一個參數表示從apk1傳過去的
        Bundle bundle = new Bundle();
        bundle.putString("arge1", "這是跳轉過來的!來自apk1");
        intent.putExtras(bundle);
        intent.setComponent(componetName);
        startActivity(intent);
        return super.onTouchEvent(event);
    }
}

ComponentName的參數已經寫的比較詳細了

package com.hooy.apk2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class Pay_Activity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //改變文字內容,標志這是從activity跳轉過來的
        TextView texView= (TextView) findViewById(R.id.text1);
        texView.setText("我來自其他activity");
        
        Intent intent= getIntent();
        String value=intent.getStringExtra("arge1");
        if(value!=null&&!value.equals("")){
            texView.setText(value);//這里將顯示“這是跳轉過來的!來自apk1”
        }else{
            System.out.println("空的參數");
        }
    }
}

第一種方法也是比較簡單。

第二種方法Intent+AndroidManifest.xml

顧名思義,此方法是用Intent和修改AndroidManifest.xml達成的。

intent就是我在上面第一個Demoapk1Activity中注釋掉的內容

要修改的AndroidManifest.xml是demoapk2中的。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hooy.apk2"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="7" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".Demoapk2Activity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <activity android:name=".Pay_Activity">
            <intent-filter>   
            <action android:name="chroya.foo"/>   
            <category android:name="android.intent.category.DEFAULT"/>   
            </intent-filter>
        </activity>
        
    </application>
</manifest>

和往常的xml一樣,只有一點不同:<intent-filter> <action android:name="chroya.foo"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter>

就是給Pay_Activity取一個名字,供其他apk訪問使用。實際效果和第一個方法一樣。

參考地址:

《啟動另外的一個應用程序的Activity(三種方式)》http://www.apkbus.com/android-43480-1-1.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM