開機啓動APP
三步曲:
- 在AndroidManifest.xml裏添加權限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
- 在項目工程裏面新建一個廣播接收器,用來接收系統開機完成廣播:
public class BootCompletedReceiver extends BroadcastReceiver {
private static final String action_boot ="android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if (action_boot.equals(intent.getAction())){
Intent mBootIntent = new Intent(context, MainActivity.class);
mBootIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mBootIntent);
}
}
}
- 最後一步,在AndroidManifest.xml裏面註冊這個廣播:
<application
......
....>
<activity .....>
.....
</activity>
......
<receiver android:name=".broadcastReceiver.BootCompletedReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>
如果需要隱藏app的標題,可以修改theme:
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
如果需要強制app運行的時候使用橫屏,可以在對應的Activity後面加上:android:screenOrientation="landscape"
判斷app在前臺運行or後臺運行
通過實現Application裏面的ActivityLifecycleCallbacks回調接口,可以拿到App所有Activity的生命週期回調,這是它的部分源碼:
public interface ActivityLifecycleCallbacks {
void onActivityCreated(Activity activity, Bundle savedInstanceState);
void onActivityStarted(Activity activity);
void onActivityResumed(Activity activity);
void onActivityPaused(Activity activity);
void onActivityStopped(Activity activity);
void onActivitySaveInstanceState(Activity activity, Bundle outState);
void onActivityDestroyed(Activity activity);
}
- 新建一個AppFrontBackHelper,用來註冊Application狀態監聽registerActivityLifecycleCallbacks,統計打開的Activity數量,如果數量從0變到1說明是從後臺切到前臺,反之,如果數量從1到0說明是從前臺切到後臺。最後預留一個OnAppStatusListener回調接口,用於別的程序傳入app前臺或者後臺運行需要執行的業務邏輯。
貼上代碼:
public class AppFrontBackHelper {
private OnAppStatusListener mOnAppStatusListener;
/**
* 註冊狀態監聽,僅在Application中使用
* @param application
* @param listener
*/
public void register(Application application, OnAppStatusListener listener){
mOnAppStatusListener = listener;
application.registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
}
public void unRegister(Application application){
application.unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks);
}
private Application.ActivityLifecycleCallbacks activityLifecycleCallbacks = new Application.ActivityLifecycleCallbacks() {
//打開的Activity數量
private int activityStartCount = 0;
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
activityStartCount++;
//數量從0變到1說明是從後臺切到前臺
if (activityStartCount == 1){
//從後臺切到前臺
if(mOnAppStatusListener != null){
mOnAppStatusListener.onFront();
}
}
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
activityStartCount--;
//數量從1到0說明是從前臺切到後臺
if (activityStartCount == 0){
//從前臺切到後臺
if(mOnAppStatusListener != null){
mOnAppStatusListener.onBack();
}
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
};
public interface OnAppStatusListener{
void onFront();
void onBack();
}
}
- 新建一個繼承Application的子類,並且通過AppFrontBackHelper註冊自身的運行狀態,此時再傳入需要實現的業務,比如如果APP在前臺運行,則隱藏導航欄、狀態欄,反之則顯示導航欄、狀態欄。
貼上代碼:
public class MyApp extends Application
{
private AppFrontBackHelper helper;
@Override
public void onCreate() {
super.onCreate();
helper = new AppFrontBackHelper();
helper.register(MyApp.this, new AppFrontBackHelper.OnAppStatusListener() {
@Override
public void onFront() {
//隱藏導航欄、狀態欄
Intent intent = new Intent();
intent.setAction("hide.systemui");
sendBroadcast(intent);
}
@Override
public void onBack() {
//顯示導航欄、狀態欄
Intent intent = new Intent();
intent.setAction("show.systemui");
sendBroadcast(intent);
}
});
}
@Override
public void onTerminate() {
super.onTerminate();
helper.unRegister(MyApp.this);
}
}
- 最後只需要在AndroidManifest.xml裏面添加上這個子類:
<application
android:name=".MyApp"
.......
</application>