天天看點

關于android手遊Sdk開發的專題(一)

随着手遊行業的蓬勃發展,以及各大IP加入,對于Android手遊插件sdk的開發也多了起來。

下面我将給大家分享手遊插件的開發細節

1.sdk開發與傳統的app開發的不同點

首先做為sdk由于要相容eclipse開發,sdk裡面是沒有R檔案的(Android studio 可打成aar包裡面有R檔案,但為了相容eclipse開發,這裡真的想吐槽一下eclipse的ADT工具Google都不更新了,還是有大量遊戲使用eclipse開發,也有不少國企和央企開發内部使用的app也是用eclipse開發的,小夥伴們快點使用Android studio開發吧,Android studio是可以直接導入eclipse項目)。

小夥伴就要問沒有R檔案如何找控件呢,不得不說google還是給我們提供了方法,

下面給大家展示工具類:

public class ResourceUtil {

public static Resources getResources(Context paramContext) {

return paramContext.getResources();

}

/**
 * 通過上下文找到layoutId
 * @param paramContext  上下文
 * @param paramString   xml檔案名
 * @return
 */
public static int getLayoutId(Context paramContext, String paramString) {

    return getResources(paramContext).getIdentifier(paramString, "layout",
            paramContext.getPackageName());
}
/**
 * 通過上下文找到stringId
 * @param paramContext  上下文
 * @param paramString   xml檔案名
 * @return
 */
public static int getStringId(Context paramContext, String paramString) {
    return getResources(paramContext).getIdentifier(paramString, "string",
            paramContext.getPackageName());

}
/**
 * 通過上下文找到drawableId
 * @param paramContext  上下文
 * @param paramString   xml檔案名
 * @return
 */
public static int getDrawableId(Context paramContext, String paramString) {
    return getResources(paramContext).getIdentifier(paramString,
            "drawable", paramContext.getPackageName());
}
/**
 * 通過上下文找到StyleId
 * @param paramContext  上下文
 * @param paramString   xml檔案名
 * @return
 */
public static int getStyleId(Context paramContext, String paramString) {
    return getResources(paramContext).getIdentifier(paramString, "style",
            paramContext.getPackageName());
}
/**
 * 通過上下文找到Id
 * @param paramContext  上下文
 * @param paramString   xml檔案名
 * @return
 */
public static int getId(Context paramContext, String paramString) {
    return getResources(paramContext).getIdentifier(paramString, "id",
            paramContext.getPackageName());
}
/**
 * 通過上下文找到colorId
 * @param paramContext  上下文
 * @param paramString   xml檔案名
 * @return
 */
public static int getColorId(Context paramContext, String paramString) {
    return getResources(paramContext).getIdentifier(paramString, "color",
            paramContext.getPackageName());
}
/**
 * 通過上下文找到arrayId
 * @param paramContext  上下文
 * @param paramString   xml檔案名
 * @return
 */
public static int getArrayId(Context paramContext, String paramString) {
    return getResources(paramContext).getIdentifier(paramString, "array",
            paramContext.getPackageName());
}
/**
 * 通過上下文找到animId
 * @param paramContext  上下文
 * @param paramString   xml檔案名
 * @return
 */
public static int getAnimId(Context paramContext, String paramString) {
    return getResources(paramContext).getIdentifier(paramString, "anim",
            paramContext.getPackageName());
}
/**
 * 通過上下文找到dimenId
 * @param paramContext  上下文
 * @param paramString   xml檔案名
 * @return
 */
public static int getDimenId(Context paramContext, String paramString) {
    return getResources(paramContext).getIdentifier(paramString, "dimen",
            paramContext.getPackageName());
}

/**
 * 進一步封裝直接找view
 * @param context  上下文
 * @param v        父控件
 * @param name     xml檔案名
 * @return
 */
public static View findViewByName(Context context, View v, String name) {

    return v.findViewById(ResourceUtil.getId(context, name));
}

/**
 *   進一步封裝直接找到布局的視圖
 * @param context  上下文
 * @param name    xml檔案名
 * @return
 */
public static View inflateViewByXML(Context context, String name) {
    return View.inflate(context, ResourceUtil.getLayoutId(context, name), null);
}
}
           

其次使用者在接入sdk時,要将sdk所需要的uses-permission,activity,service,receiver等配置項加入到demo工程的AndroidManifest中去,其中還一項标簽也很重要 這個标簽是用來讀取

背景給使用者配置設定的appId,appKey等資料的,下面就為大家展示demo的AndroidManfest代碼:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.anfan.pay.demo.sdkdemo"
android:versionCode="25"
android:versionName="2.5">
<!-- 需要的權限,請添加到自己工程的清單檔案中 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<!-- testing -->
<uses-permission android:name="android.permission.READ_LOGS" />
<!-- 浮動通知生成截圖權限 -->
 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!--發送短信的權限-->
<uses-permission android:name="android.permission.SEND_SMS" />
<!-- 微信支付 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!--NETWORK_PROVIDER-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--   GPS-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
    android:allowBackup="true"
    android:icon="@drawable/anfan_icon"
    android:label="@string/app_name">
    <activity
        android:name="com.anfan.pay.demo.sdkdemo.GameActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.anfeng.pay.activity.AFClickLogin"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:screenOrientation="behind"
        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
    <activity
        android:name="com.anfeng.pay.activity.AFBoundPhone"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:screenOrientation="behind"
        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
    <activity
        android:name="com.anfeng.pay.activity.AFLogin"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:screenOrientation="behind"
        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
    <activity
        android:name="com.anfeng.pay.activity.AFMissPass"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:screenOrientation="behind"
        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
    <activity
        android:name="com.anfeng.pay.activity.AFPayType"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:launchMode="singleTask"
        android:screenOrientation="behind"
        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
    <activity
        android:name="com.anfeng.pay.activity.AFRegister"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:screenOrientation="behind"
        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
    <!-- 支付寶相關 -->
    <activity
        android:name="com.alipay.sdk.app.H5PayActivity"
        android:configChanges="orientation|keyboardHidden|navigation|screenSize"
        android:exported="false"
        android:screenOrientation="behind"
        android:windowSoftInputMode="adjustResize|stateHidden"/>
    <activity
        android:name="com.alipay.sdk.app.H5AuthActivity"
        android:configChanges="orientation|keyboardHidden|navigation"
        android:exported="false"
        android:screenOrientation="behind"
        android:windowSoftInputMode="adjustResize|stateHidden"/>
    <!-- 銀聯 -->
    <activity
        android:name="com.unionpay.uppay.PayActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:excludeFromRecents="true"
        android:label="@string/app_name"
        android:windowSoftInputMode="adjustResize" />
    <!-- 微信支付 -->
    <activity
        android:name="com.ipaynow.wechatpay.plugin.inner_plugin.wechat_plugin.activity.WeChatNotifyActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Dialog"/>
    <service android:name="com.game.alarm.download.DownloadService">
        <intent-filter>
            <action android:name="download.service.action" />
        </intent-filter>
    </service>
    <!-- 提供給合作方的gameId或appId(應用數字id) 接入時請修改值為在商戶背景申請的appid -->
    <meta-data android:name="appID" android:value="778" />
    <meta-data android:name="appKey" android:value="4c6e0a99384aff934c6e0a99" />
    <!-- SDK需要知曉請求的來源 ,即分銷商,遊戲廠商無須修改 -->
    <meta-data android:name="retailer" android:value="255" />
</application>
</manifest> 
           

此時當使用者初始化sdk的時候,用戶端就能知道是誰接入,這樣就能完成與背景的資料互動了,讀取meta-data标簽的代碼:

/**
 *  讀取meta-data的整型值
 *  <meta-data android:name="appID" android:value="778" />
 *   META_DATA_NAME 就是appID ,
 * @param context
 * @return  就是value的值
 */
private static  String metaDataValueOfInter(Context context){
    try {
        ApplicationInfo applicationInfo = context.getPackageManager().
                getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
        String valueOfInter=String.valueOf(applicationInfo.metaData.getInt(META_DATA_NAME));
        return  valueOfInter;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return  null;
}

/**
 *  讀取meta-data的字元串
 *  <meta-data android:name="appKey" android:value="4c6e0a99384aff934c6e0a99" />
 *   META_DATA_NAME 就是appKey ,
 * @param context
 * @return 就是value的值
 */
private static  String metaDataValueOfString(Context context){
    try {
        ApplicationInfo applicationInfo = context.getPackageManager().
                getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
        String valueOfInter=applicationInfo.metaData.getString(META_DATA_NAME);
        return  valueOfInter;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return  null;
    }
           

今天就先給小夥伴們介紹到這裡,歡迎大家給我留言,也可發郵件給

emali:[email protected]