Android 利用系統廣播實現開機啓動APP & 判斷app在前臺運行or後臺運行

開機啓動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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章