準(zhǔn)確測(cè)量 Android 應(yīng)用中 Activity 和 Fragment 的啟動(dòng)時(shí)間的詳細(xì)過(guò)程
如何準(zhǔn)確測(cè)量 Android 應(yīng)用中 Activity 和 Fragment 的啟動(dòng)時(shí)間
在 Android 應(yīng)用開(kāi)發(fā)中,了解每個(gè) Activity 和 Fragment 的啟動(dòng)時(shí)間對(duì)于性能優(yōu)化至關(guān)重要。本文將介紹幾種方法來(lái)準(zhǔn)確測(cè)量 Activity 和 Fragment 的啟動(dòng)時(shí)間,并提供實(shí)際操作步驟,以幫助提升應(yīng)用的響應(yīng)速度和用戶(hù)體驗(yàn)。
1. 使用 adb shell am start -W 命令
adb shell am start -W 命令是一種簡(jiǎn)單且直接的方法,用于測(cè)量 Activity 的啟動(dòng)時(shí)間。該命令啟動(dòng)指定的 Activity 并輸出相關(guān)的時(shí)間數(shù)據(jù)。以下是如何使用該命令,以及如何解決常見(jiàn)錯(cuò)誤。
1.1 命令
adb shell am start -W -n <your.package.name>/<your.package.name.yourActivity>
1.2 輸出解釋
ThisTime: 當(dāng)前 Activity 的啟動(dòng)時(shí)間。TotalTime: 從應(yīng)用啟動(dòng)到當(dāng)前 Activity 的總時(shí)間。WaitTime: 系統(tǒng)等待時(shí)間。
1.3 啟動(dòng) Activity 并傳遞參數(shù)
使用 -e 選項(xiàng)傳遞參數(shù)
要傳遞鍵值對(duì)參數(shù),可以使用 -e 選項(xiàng)。-e 選項(xiàng)用于將一個(gè)字符串鍵值對(duì)傳遞給目標(biāo) Activity。如果有多個(gè)鍵值對(duì)需要傳遞,可以使用多個(gè) -e 選項(xiàng)。
命令格式
adb shell am start -n <your.package.name>/<your.package.name.YourActivity> -e <key1> <value1> -e <key2> <value2> ...
-n <your.package.name>/<your.package.name.YourActivity>:指定要啟動(dòng)的Activity。-e <key> <value>:指定要傳遞的參數(shù)及其對(duì)應(yīng)的值。key是參數(shù)的名稱(chēng),value是參數(shù)的值。
示例
應(yīng)用程序包名為 com.example.app,要啟動(dòng)的 Activity 是 com.example.app.ui.MainActivity,并且需要傳遞兩個(gè)參數(shù):user_id 和 session_token。可以使用以下命令:
adb shell am start -n com.example.app/com.example.app.ui.MainActivity -e user_id 12345 -e session_token abcdef123456
傳遞多種數(shù)據(jù)類(lèi)型
除了使用 -e 選項(xiàng)傳遞字符串參數(shù),還可以使用以下選項(xiàng)傳遞其他數(shù)據(jù)類(lèi)型的參數(shù):
-e:傳遞字符串鍵值對(duì)。-en:傳遞整數(shù)鍵值對(duì)。-ef:傳遞浮點(diǎn)數(shù)鍵值對(duì)。-el:傳遞長(zhǎng)整型鍵值對(duì)。-eb:傳遞布爾鍵值對(duì)。-eia:傳遞整數(shù)數(shù)組鍵值對(duì)。-efa:傳遞浮點(diǎn)數(shù)數(shù)組鍵值對(duì)。
示例
如果需要傳遞一個(gè)整數(shù)和一個(gè)布爾值參數(shù),可以使用以下命令:
adb shell am start -n com.example.app/com.example.app.ui.MainActivity -en max_retries 5 -eb is_active true
在這個(gè)例子中,max_retries 是一個(gè)整數(shù)參數(shù),is_active 是一個(gè)布爾參數(shù)。
解析傳遞的參數(shù)
在的 Activity 中,可以通過(guò) Intent 對(duì)象來(lái)獲取傳遞的參數(shù)。例如:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = getIntent();
String userId = intent.getStringExtra("user_id");
String sessionToken = intent.getStringExtra("session_token");
// 使用獲取的參數(shù)
}
}對(duì)于其他數(shù)據(jù)類(lèi)型的參數(shù),可以使用對(duì)應(yīng)的 Intent 方法進(jìn)行獲取,例如 getIntExtra、getBooleanExtra 等。
通過(guò)使用 -e 及相關(guān)選項(xiàng),可以方便地將參數(shù)傳遞給 Activity,在測(cè)試和調(diào)試過(guò)程中模擬各種條件。這使得驗(yàn)證應(yīng)用程序的不同功能變得更加高效和靈活。
1.4 常見(jiàn)錯(cuò)誤及解決方案
1.4.1 java.lang.SecurityException: Permission Denial
錯(cuò)誤信息:
java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example.myapp/.MainActivity mCallingUid=2000 } from null (pid=29129, uid=2000) not exported from uid 10600
原因: 當(dāng)嘗試啟動(dòng)的 Activity 沒(méi)有配置為導(dǎo)出的或沒(méi)有適當(dāng)?shù)臋?quán)限時(shí),會(huì)出現(xiàn)此錯(cuò)誤。
解決方案:
修改 AndroidManifest.xml: 確保目標(biāo) Activity 已配置為 exported="true",這樣才能允許外部調(diào)用。
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>檢查權(quán)限: 確保應(yīng)用具有適當(dāng)?shù)臋?quán)限,或嘗試使用 adb 命令以 root 權(quán)限運(yùn)行。
1.4.2 java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example.myapp/.MainActivity } from null (pid=29219, uid=2000) not exported from uid 10600
錯(cuò)誤信息:
java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example.myapp/.MainActivity mCallingUid=2000 } from null (pid=29219, uid=2000) not exported from uid 10600
原因: 該錯(cuò)誤通常表示目標(biāo) Activity 沒(méi)有正確配置為導(dǎo)出或啟動(dòng)。即使 Activity 是導(dǎo)出的,它可能沒(méi)有正確設(shè)置 intent-filter 或 launchMode。
解決方案:
配置 intent-filter: 確保 Activity 正確配置了 intent-filter,如果需要,它應(yīng)包括 MAIN 和 LAUNCHER 動(dòng)作和類(lèi)別。
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>檢查啟動(dòng)模式: 如果 Activity 是內(nèi)部活動(dòng)或不需要被外部啟動(dòng),考慮使用其他方法測(cè)試,或者設(shè)置 android:exported="true" 確保外部調(diào)用。
1.4.3 ActivityNotFoundException
錯(cuò)誤信息:
android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.myapp/.MainActivity}; have you declared this activity in your AndroidManifest.xml?
原因: 該錯(cuò)誤表示系統(tǒng)無(wú)法找到指定的 Activity。這可能是因?yàn)樵?AndroidManifest.xml 中沒(méi)有正確聲明該 Activity,或包名和類(lèi)名錯(cuò)誤。
解決方案:
檢查 AndroidManifest.xml: 確保目標(biāo) Activity 已在 AndroidManifest.xml 中正確聲明。
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>核對(duì)包名和類(lèi)名: 確保 adb 命令中的包名和類(lèi)名與實(shí)際聲明的一致。
2. 手動(dòng)記錄啟動(dòng)時(shí)間
為了獲得更準(zhǔn)確的數(shù)據(jù),可以在代碼中手動(dòng)記錄每個(gè) Activity 的啟動(dòng)時(shí)間。這種方法能夠提供更符合實(shí)際使用場(chǎng)景的數(shù)據(jù)。
2.1 代碼
在每個(gè) Activity 的 onCreate 方法中記錄啟動(dòng)時(shí)間:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
long startTime = System.currentTimeMillis();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
long elapsedTime = System.currentTimeMillis() - startTime;
Log.d(TAG, "Activity startup time: " + elapsedTime + " ms");
}
}2.2 捕獲日志
使用 adb logcat 捕獲啟動(dòng)時(shí)間日志:
adb logcat -s MainActivity
3. 使用 Application.ActivityLifecycleCallbacks 接口記錄activity啟動(dòng)時(shí)長(zhǎng)
為了自動(dòng)記錄每個(gè) Activity 的啟動(dòng)時(shí)間,避免在每個(gè) Activity 中重復(fù)編寫(xiě)代碼,可以使用 Application.ActivityLifecycleCallbacks 接口。
3.1使用注解標(biāo)記中文名
首先,我們創(chuàng)建一個(gè)自定義注解來(lái)標(biāo)記 Activity 的中文名。
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface ChineseName {
String value();
}然后,在每個(gè) Activity 類(lèi)上使用這個(gè)注解。
import android.app.Activity;
import android.os.Bundle;
@ChineseName("我的Activity中文名")
public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Activity 其他代碼...
}
}3.2創(chuàng)建生命周期回調(diào)類(lèi)
實(shí)現(xiàn) Application.ActivityLifecycleCallbacks
創(chuàng)建一個(gè)實(shí)現(xiàn) Application.ActivityLifecycleCallbacks 接口的類(lèi),以記錄每個(gè) Activity 的啟動(dòng)時(shí)間,并使用反射獲取中文名。
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.util.Log;
public class ActivityLifecycleHandler implements Application.ActivityLifecycleCallbacks {
private static final String TAG = "ActivityLifecycleHandler";
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
long startTime = System.currentTimeMillis();
activity.getWindow().getDecorView().post(() -> {
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
String activityName = getChineseName(activity);
Log.d(TAG, activityName + " creation time: " + duration + " ms");
});
}
@Override
public void onActivityStarted(Activity activity) {}
@Override
public void onActivityResumed(Activity activity) {}
@Override
public void onActivityPaused(Activity activity) {}
@Override
public void onActivityStopped(Activity activity) {}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
@Override
public void onActivityDestroyed(Activity activity) {}
private String getChineseName(Activity activity) {
ChineseName annotation = activity.getClass().getAnnotation(ChineseName.class);
if (annotation != null) {
return annotation.value();
} else {
return activity.getClass().getSimpleName();
}
}
}3.3 注冊(cè)生命周期回調(diào)
在 Application 類(lèi)中注冊(cè)生命周期回調(diào):
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new AppLifecycleHandler());
}
}3.4 修改 AndroidManifest.xml
確保在 AndroidManifest.xml 中指定自定義的 Application 類(lèi):
<application
android:name=".MyApp"
...>
...
</application>3.5持續(xù)日志輸出
使用 adb logcat 命令捕獲啟動(dòng)時(shí)間的日志輸出。
adb logcat -s AppLifecycleHandler
每次切換頁(yè)面或啟動(dòng)新的 Activity 時(shí),控制臺(tái)會(huì)輸出類(lèi)似如下的日志信息:
07-04 14:23:45.123 1234-1234/com.example.myapp D/AppLifecycleHandler: MainActivity startup time: 150 ms
07-04 14:23:47.567 1234-1234/com.example.myapp D/AppLifecycleHandler: SettingsActivity startup time: 180 ms
07-04 14:23:47.567 1234-1234/com.example.myapp D/AppLifecycleHandler: 我的Activity中文名 startup time: 180 ms
這些日志顯示了每個(gè) Activity 的啟動(dòng)時(shí)間。通過(guò)這些數(shù)據(jù),可以分析和優(yōu)化應(yīng)用性能。
4.記錄所有 Fragment 啟動(dòng)時(shí)間
同樣,可以通過(guò)覆蓋 Fragment 的生命周期方法來(lái)記錄 Fragment 的啟動(dòng)時(shí)間。
4.1使用注解標(biāo)記中文名
同樣地,為 Fragment 使用相同的 ChineseName 注解。
import androidx.fragment.app.Fragment;
@ChineseName("我的Fragment中文名")
public class MyFragment extends Fragment {
// Fragment 代碼...
}4.2覆蓋 Fragment 生命周期方法
首先,創(chuàng)建一個(gè)基類(lèi) BaseFragment,覆蓋 Fragment 的 onCreateView 方法,以記錄每個(gè) Fragment 的啟動(dòng)時(shí)間。
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
public class FragmentLifecycleHandler extends FragmentManager.FragmentLifecycleCallbacks {
private static final String TAG = "FragmentLifecycleHandler";
@Override
public void onFragmentViewCreated(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull View v, @Nullable Bundle savedInstanceState) {
long startTime = System.currentTimeMillis();
f.getView().post(() -> {
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
String fragmentName = getChineseName(f);
Log.d(TAG, fragmentName + " view creation time: " + duration + " ms");
});
}
private String getChineseName(Fragment fragment) {
ChineseName annotation = fragment.getClass().getAnnotation(ChineseName.class);
if (annotation != null) {
return annotation.value();
} else {
return fragment.getClass().getSimpleName();
}
}
}4.3完整代碼示例
所有的 Fragment 類(lèi)繼承自 BaseFragment。
public class MyFragment extends BaseFragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_my, container, false);
}
}4.4持續(xù)日志輸出
使用 adb logcat 命令捕獲啟動(dòng)時(shí)間的日志輸出。
adb logcat -s FragmentLifecycle
每次加載 Fragment 時(shí),控制臺(tái)會(huì)輸出類(lèi)似如下的日志信息:
07-04 14:23:45.123 1234-1234/com.example.myapp D/FragmentLifecycle: MyFragment startup time: 120 ms
這些日志顯示了每個(gè) Fragment 的啟動(dòng)時(shí)間。通過(guò)這些數(shù)據(jù),可以分析和優(yōu)化應(yīng)用性能。
5. 使用第三方工具
除了自定義實(shí)現(xiàn)外,還有許多第三方工具和庫(kù)可以幫助測(cè)量和優(yōu)化應(yīng)用的啟動(dòng)時(shí)間。以下是一些常用的工具和庫(kù):
5.1 阿里云移動(dòng)監(jiān)控(Aliyun Mobile Monitoring)
阿里云移動(dòng)監(jiān)控 提供了全面的性能監(jiān)控解決方案,包括啟動(dòng)時(shí)間、崩潰分析、用戶(hù)行為分析等功能。
使用步驟:
1.集成 SDK: 在阿里云控制臺(tái)創(chuàng)建一個(gè)項(xiàng)目,并下載阿里云移動(dòng)監(jiān)控 SDK。將 SDK 集成到的 Android 應(yīng)用中。具體步驟可以參考 阿里云官方文檔。
2.配置性能監(jiān)控: 在阿里云控制臺(tái)中配置性能監(jiān)控,包括啟動(dòng)時(shí)間監(jiān)控和用戶(hù)行為分析。
3.查看性能數(shù)據(jù): 登錄阿里云控制臺(tái),訪問(wèn) 阿里云移動(dòng)監(jiān)控 部分,可以查看應(yīng)用的啟動(dòng)時(shí)間、崩潰報(bào)告以及用戶(hù)行為分析數(shù)據(jù)。
5.2 騰訊云移動(dòng)分析(Tencent Cloud Mobile Analytics)
騰訊云移動(dòng)分析 提供了全面的應(yīng)用性能監(jiān)控和用戶(hù)行為分析功能,適用于中國(guó)國(guó)內(nèi)的應(yīng)用開(kāi)發(fā)者。
使用步驟:
1.集成 SDK:
集成 SDK:
- 在騰訊云控制臺(tái)創(chuàng)建一個(gè)項(xiàng)目,并下載騰訊云移動(dòng)分析 SDK。
- 將 SDK 集成到的 Android 應(yīng)用中。具體步驟可以參考 騰訊云官方文檔.
配置性能監(jiān)控:
- 在騰訊云控制臺(tái)中配置性能監(jiān)控和用戶(hù)行為分析功能。
查看性能數(shù)據(jù):
- 登錄騰訊云控制臺(tái),訪問(wèn) 騰訊云移動(dòng)分析 部分,可以查看應(yīng)用的啟動(dòng)時(shí)間、崩潰報(bào)告以及用戶(hù)行為數(shù)據(jù)。
5.3 百度移動(dòng)統(tǒng)計(jì)(Baidu Mobile Statistics)
百度移動(dòng)統(tǒng)計(jì) 提供了應(yīng)用性能監(jiān)控和用戶(hù)行為分析功能,幫助開(kāi)發(fā)者了解應(yīng)用的性能和用戶(hù)行為。
使用步驟:
- 集成 SDK:
- 在百度統(tǒng)計(jì)控制臺(tái)創(chuàng)建一個(gè)項(xiàng)目,并下載百度移動(dòng)統(tǒng)計(jì) SDK。
- 將 SDK 集成到的 Android 應(yīng)用中。具體步驟可以參考 百度統(tǒng)計(jì)官方文檔.
- 配置性能監(jiān)控:
- 在百度統(tǒng)計(jì)控制臺(tái)中配置性能監(jiān)控功能和用戶(hù)行為分析。
- 查看性能數(shù)據(jù):
- 登錄百度統(tǒng)計(jì)控制臺(tái),訪問(wèn) 百度移動(dòng)統(tǒng)計(jì) 部分,可以查看應(yīng)用的啟動(dòng)時(shí)間、崩潰報(bào)告和用戶(hù)行為數(shù)據(jù)。
5.4 Android Profiler
Android Profiler 是 Android Studio 提供的一套工具,可以幫助實(shí)時(shí)監(jiān)控應(yīng)用的性能,包括啟動(dòng)時(shí)間、內(nèi)存使用、CPU 使用等。
使用步驟:
- 啟動(dòng) Android Studio Profiler:
- 打開(kāi) Android Studio,運(yùn)行的應(yīng)用。
- 選擇
View>Tool Windows>Profiler,然后選擇的應(yīng)用進(jìn)程。
- 監(jiān)控應(yīng)用啟動(dòng)時(shí)間:
- 在 Profiler 窗口中,選擇
CPU視圖。啟動(dòng)應(yīng)用時(shí),Profiler 會(huì)記錄 - 啟動(dòng)過(guò)程中 CPU 的使用情況,可以幫助了解啟動(dòng)時(shí)間及其瓶頸。
- 在 Profiler 窗口中,選擇
- 分析性能數(shù)據(jù):
- Profiler 提供的時(shí)間線視圖和詳細(xì)的性能指標(biāo)可以幫助識(shí)別啟動(dòng)過(guò)程中的性能問(wèn)題。
- 可以查看應(yīng)用的活動(dòng)生命周期、內(nèi)存使用情況以及 CPU 占用情況,從而找到優(yōu)化的切入點(diǎn)。
5.5 LeakCanary
LeakCanary 是一個(gè)開(kāi)源的內(nèi)存泄漏檢測(cè)庫(kù),可以幫助檢測(cè)和修復(fù)內(nèi)存泄漏,從而間接優(yōu)化應(yīng)用的啟動(dòng)時(shí)間和整體性能。
使用步驟:
集成 LeakCanary:
在 build.gradle 文件中添加 LeakCanary 的依賴(lài):
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10'
自動(dòng)檢測(cè)內(nèi)存泄漏:
LeakCanary 會(huì)自動(dòng)監(jiān)控應(yīng)用的內(nèi)存泄漏并在發(fā)現(xiàn)泄漏時(shí)發(fā)出警告。
修復(fù)內(nèi)存泄漏:
根據(jù) LeakCanary 提供的報(bào)告,識(shí)別并修復(fù)內(nèi)存泄漏問(wèn)題,從而提高應(yīng)用的性能和啟動(dòng)速度。 備注 Firebase Performance Monitoring
Firebase Performance Monitoring 是一個(gè)由 Google 提供的性能監(jiān)控工具,它可以幫助開(kāi)發(fā)者監(jiān)控應(yīng)用的性能,包括啟動(dòng)時(shí)間、網(wǎng)絡(luò)請(qǐng)求時(shí)間等。然而,由于某些 Google 服務(wù)在中國(guó)大陸可能會(huì)受到訪問(wèn)限制,F(xiàn)irebase Performance Monitoring 的功能和數(shù)據(jù)傳輸可能會(huì)受到影響。
官方地址:
Firebase Performance Monitoring 官方文檔
總結(jié)
使用這些第三方工具,可以更全面地監(jiān)控和優(yōu)化應(yīng)用的啟動(dòng)時(shí)間和整體性能。三方庫(kù) 和 Android Profiler 提供了實(shí)時(shí)的性能數(shù)據(jù)和分析功能,而 LeakCanary 可以幫助發(fā)現(xiàn)并修復(fù)內(nèi)存泄漏問(wèn)題。這些工具和庫(kù)的結(jié)合使用,可以幫助提升應(yīng)用的用戶(hù)體驗(yàn)和性能。
到此這篇關(guān)于準(zhǔn)確測(cè)量 Android 應(yīng)用中 Activity 和 Fragment 的啟動(dòng)時(shí)間的詳細(xì)過(guò)程的文章就介紹到這了,更多相關(guān)Android Activity 和 Fragment 啟動(dòng)時(shí)間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android從Fragment跳轉(zhuǎn)到其他Activity的簡(jiǎn)單實(shí)例
- Android開(kāi)發(fā)使用Activity嵌套多個(gè)Fragment實(shí)現(xiàn)橫豎屏切換功能的方法
- Android 中Fragment與Activity通訊的詳解
- Android中Activity和Fragment傳遞數(shù)據(jù)的兩種方式
- 詳解Android activity與fragment之間的通信交互
- Android鬧鐘啟動(dòng)時(shí)間設(shè)置無(wú)效問(wèn)題的解決方法
- 安卓(Android)開(kāi)發(fā)之統(tǒng)計(jì)App啟動(dòng)時(shí)間
相關(guān)文章
Android實(shí)現(xiàn)狀態(tài)欄和虛擬按鍵背景顏色的變化實(shí)例代碼詳解
今天介紹一下,我在項(xiàng)目開(kāi)發(fā)過(guò)程中,實(shí)現(xiàn)狀態(tài)欄和虛擬按鍵背景顏色變化的方法,實(shí)現(xiàn)方式是,通過(guò)隱藏系統(tǒng)的狀態(tài)欄和虛擬按鍵的背景,實(shí)現(xiàn)圖片和背景顯示到狀態(tài)欄和虛擬按鍵下方,需要的朋友可以參考下2019-05-05
詳解Activity之singletast啟動(dòng)模式及如何使用intent傳值
在一個(gè)新棧中創(chuàng)建該Activity實(shí)例,并讓多個(gè)應(yīng)用共享改棧中的該Activity實(shí)例。一旦改模式的Activity的實(shí)例存在于某個(gè)棧中,任何應(yīng)用再激活改Activity時(shí)都會(huì)重用該棧中的實(shí)例,其效果相當(dāng)于多個(gè)應(yīng)用程序共享一個(gè)應(yīng)用,不管誰(shuí)激活該Activity都會(huì)進(jìn)入同一個(gè)應(yīng)用中2015-11-11
Android使用glide加載gif動(dòng)畫(huà)設(shè)置播放次數(shù)
這篇文章主要為大家詳細(xì)介紹了Android使用glide加載gif動(dòng)畫(huà)設(shè)置播放次數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Android獲取通話(huà)時(shí)間實(shí)例分析
我們知道安卓系統(tǒng)中通話(huà)時(shí)長(zhǎng)應(yīng)該是歸Callog管,所以建議去查查ContactProvider,或者是TelephonyProvider,本文也總結(jié)了一些,需要的朋友可以參考下2012-12-12
android studio library 模塊中正確引用aar的實(shí)例講解
下面小編就為大家分享一篇android studio library 模塊中正確引用aar的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
android實(shí)現(xiàn)手機(jī)截屏并保存截圖功能
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)手機(jī)截屏并保存截圖功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
Android 網(wǎng)絡(luò)狀態(tài)實(shí)時(shí)監(jiān)聽(tīng)代碼實(shí)例(一)
本文給大家介紹Android 網(wǎng)絡(luò)狀態(tài)實(shí)時(shí)監(jiān)聽(tīng)代碼實(shí)例(一),對(duì)android網(wǎng)絡(luò)狀態(tài)監(jiān)聽(tīng)相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-03-03
Android使用Scroll+Fragment仿京東分類(lèi)效果
這篇文章主要為大家詳細(xì)介紹了Android使用Scroll+Fragment仿京東分類(lèi)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
Android多種方式實(shí)現(xiàn)相機(jī)圓形預(yù)覽的示例代碼
這篇文章主要介紹了Android多種方式實(shí)現(xiàn)相機(jī)圓形預(yù)覽的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08

