随着手遊行業的蓬勃發展,以及各大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]