1. 獲取assets目錄中的資源
android:
AssetManager am = getResources().getAssets();
try{
InputStream is = am.open("xxxx.png");
}catch(IOException e){
}
smali:
invoke-virtual {p0}, Lcom/speedsoftware/rootexplorer/RootExplorer;->getResources()Landroid/content/res/Resources;
move-result-object vX
invoke-virtual {vX}, Landroid/content/res/Resources;->getAssets()Landroid/content/res/AssetManager;
move-result-object v0
2. new對象的語法
android:
this.pic_hd1 = new PicHandler();
smali:
new-instance v6,Lcom/qt/MainActivity$PicHandler;
move-object v9,v6
move-object v6,v9
move-object v7,v9
move-object v8,v0
invoke-direct {v7,v8},Lcom/qt/MainActivity$PicHandler;-><init>(Lcom/qt/MainActivity;)V
iput-object v6,v5,Lcom/qt/MainActivity;->pic_hd1:Landroid/os/Handler;
3. 操作Fragment的語法 android.app.FragmentManager
android:
// 顯示調(diào)用父類
FragmentManager fragmentManagerSuper = super.getFragmentManager();
// 調(diào)用繼承的方法,實際仍調(diào)用的是父類的
FragmentManager fragmentManagerThis = this.getFragmentManager();
// 開啟fragmentTransaction事務
FragmentTransaction fragmentTransaction = fragmentManagerSuper.beginTransaction();
// 加載fragment布局
Fragment fragment = fragmentManagerSuper.findFragmentById(R.layout.activity_main);
// 加入fragmentTransaction中的fragment才可以調(diào)用show() hide()
fragmentTransaction.add(fragment, "test");
// 隱藏fragment
fragmentTransaction.hide(fragment);
// 顯示fragment
fragmentTransaction.show(fragment);
// 提交后hide() show()才生效
fragmentTransaction.commit();
smali:
invoke-super {p0}, Landroid/support/v7/app/AppCompatActivity;->getFragmentManager()Landroid/app/FragmentManager;
move-result-object v1
.local v1, "fragmentManagerSuper":Landroid/app/FragmentManager;
invoke-virtual {p0}, Ltop/nodcat/www/testlogindemo/MainActivity;->getFragmentManager()Landroid/app/FragmentManager;
move-result-object v2
.local v2, "fragmentManagerThis":Landroid/app/FragmentManager;
invoke-virtual {v1}, Landroid/app/FragmentManager;->beginTransaction()Landroid/app/FragmentTransaction;
move-result-object v3
.local v3, "fragmentTransaction":Landroid/app/FragmentTransaction;
invoke-virtual {v1, v0}, Landroid/app/FragmentManager;->findFragmentById(I)Landroid/app/Fragment;
move-result-object v0
.local v0, "fragment":Landroid/app/Fragment;
const-string v4, "test"
invoke-virtual {v3, v0, v4}, Landroid/app/FragmentTransaction;->add(Landroid/app/Fragment;Ljava/lang/String;)Landroid/app/FragmentTransaction;
invoke-virtual {v3, v0}, Landroid/app/FragmentTransaction;->hide(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;
invoke-virtual {v3, v0}, Landroid/app/FragmentTransaction;->show(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;
invoke-virtual {v3}, Landroid/app/FragmentTransaction;->commit()I
4. 操作Fragment的語法 android.support.v4.app.FragmentManager
谷歌推薦使用android.support.v4包中的組件,因此比較新的app都會使用android.support.v4包中類。
java
// 獲取android.support.v4.app.FragmentManager
FragmentManager fragmentManagerThis = this.getSupportFragmentManager();
// 開啟fragmentTransaction事務
FragmentTransaction fragmentTransaction = fragmentManagerThis.beginTransaction();
// 方式一:在Activity的layout.xml布局文件中靜態(tài)添加fragment布局方式
// // 加載布局文件
// Fragment fragment = fragmentManagerThis.findFragmentById(R.layout.fragment_hide_features);
// // 加入fragmentTransaction中的fragment才可以調(diào)用show() hide()
// fragmentTransaction.add(fragment, "test");
// 方式二:在Activity的.java文件中動態(tài)添加
// 創(chuàng)建需要添加的Fragment :HideFeaturesFragment
HideFeaturesFragment hideFeaturesFragment = new HideFeaturesFragment();
// 將創(chuàng)建的fragment添加到Activity布局文件中定義的占位符中(FrameLayout)
fragmentTransaction.add(R.id.fragment_main, hideFeaturesFragment);
// // 隱藏fragment
// fragmentTransaction.hide(fragment);
// // 顯示fragment
// fragmentTransaction.show(fragment);
// 提交后hide() show()才生效
fragmentTransaction.commit();
5. 按鈕設置點擊事件的語法
android:
btn_login = findViewById(R.id.button_login);
// 設置按鈕點擊事件
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
...
}
});
smali:
const v1, 0x7f070023 # 按鈕id
invoke-virtual {p0, v1}, Ltop/nodcat/www/testlogindemo/MainActivity;->findViewById(I)Landroid/view/View;
move-result-object v1
check-cast v1, Landroid/widget/Button; # 類型轉(zhuǎn)換
iput-object v1, p0, Ltop/nodcat/www/testlogindemo/MainActivity;->btn_login:Landroid/widget/Button; # this.btn_login = v1
iget-object v1, p0, Ltop/nodcat/www/testlogindemo/MainActivity;->btn_login:Landroid/widget/Button;
new-instance v2, Ltop/nodcat/www/testlogindemo/MainActivity$1; # 匿名內(nèi)部類 View.OnClickListener接口的匿名實現(xiàn)
invoke-direct {v2, p0}, Ltop/nodcat/www/testlogindemo/MainActivity$1;-><init>(Ltop/nodcat/www/testlogindemo/MainActivity;)V # 構(gòu)造函數(shù)
invoke-virtual {v1, v2}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V # 為按鈕設置監(jiān)聽事件
6. 區(qū)分invoke-virtual、invoke-super
invoke-virtual表示調(diào)用繼承的方法 this.method();
invoke-super表示直接調(diào)用父類的方法 super.method();
invoke-direct表示調(diào)用自身的方法或者某個對象構(gòu)造方法
android:
this.login(username, pwd);
FragmentManager fragmentManagerSuper = super.getFragmentManager();
FragmentManager fragmentManagerThis = this.getFragmentManager();
smali:
7. Activity跳轉(zhuǎn)的語法
android:
// 方法一:可以在Activity以及Fragment中調(diào)用該方法跳轉(zhuǎn)到指定的Activity
this.startActivity(new Intent(this,PanelActivity.class));
// 方法二:在AndroidManifest.xml中配置<intent-filter>
<activity android:alwaysRetainTaskState="true" android:exported="true" android:label="車來了" android:launchMode="singleTask" android:name="dev.xesam.chelaile.app.module.PanelHostActivity" android:screenOrientation="portrait" android:theme="@style/AppTheme" android:windowSoftInputMode="adjustPan">
<intent-filter>
<action android:name="android.intent.action.CREATE_SHORTCUT"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="panelhost" android:scheme="chelaile"/>
</intent-filter>
<intent-filter> <action android:name="dev.xesam.chelaile.app.module.PanelHostActivity"/> </intent-filter>
</activity>
// 傳入指定action動作的Intent后將自動匹配跳轉(zhuǎn)的activity
this.startActivity(new Intent("android.intent.action.VIEW"));
smali:
# 方法二對應smali:
new-instance v0, Landroid/content/Intent;
const-string v1, "android.intent.action.VIEW"
invoke-direct {v0, v1}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V # new Intent("android.intent.action.VIEW")
invoke-virtual {p0, v0}, Ladmsdk/library/activity/AdDetailActivity;->startActivity(Landroid/content/Intent;)V # this.startActivity(v0); v0=new Intent("android.intent.action.VIEW")
8. 安卓動態(tài)設置控件布局屬性的語法
android:
textview.setLayoutParams(layoutParams);
smail:
invoke-virtual {v0, v1}, Landroid/view/View;->setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V # v0=textview對象 v1為LayoutParams對象
9. 獲取證書簽名的語法
android:
/** 通過包管理器獲得指定包名包含簽名的包信息,PackageManager.GET_SIGNATURES的值為64,轉(zhuǎn)換為16進制則為0x40 **/
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
/******* 通過返回的包信息獲得簽名數(shù)組 *******/
Signature[] signatures = packageInfo.signatures;
/******* 循環(huán)遍歷簽名數(shù)組拼接證書簽名 *******/
return signatures[0].toCharsString();
/************** 得到證書簽名 **************/
smali:
iget-object v1, p0, Lcom/shuqi/app/ShuqiApplication$3;->val$context:Landroid/content/Context;
invoke-virtual {v1}, Landroid/content/Context;->getPackageName()Ljava/lang/String;
move-result-object v1
const/16 v2, 0x40
# 獲取packageInfo對象
invoke-virtual {v0, v1, v2}, Landroid/content/pm/PackageManager;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
move-result-object v0
# 得到packageInfo.signatures屬性,該屬性為Signature[] 數(shù)組
iget-object v0, v0, Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature;
const/4 v1, 0x0
# 獲取數(shù)組中的第一個元素signatures[0]即Signature對象
aget-object v0, v0, v1
10. 退出app的語法 — 方式一
android:
# 殺掉自己進程
android.os.Process.killProcess(android.os.Process.myPid());
smali:
# 獲取進程ID
invoke-static {}, Landroid/os/Process;->myPid()I
move-result v0
# 殺死指定ID的進程
invoke-static {v0}, Landroid/os/Process;->killProcess(I)V
11. 退出app的語法 — 方式二
android:
System.exit(0);
smali:
const v0, 0
invoke-static {v0}, Ljava/lang/System;->exit(I)V