开机启动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\";@Overridepublic 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;@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {}@Overridepublic void onActivityStarted(Activity activity) {activityStartCount++;//数量从0变到1说明是从后台切到前台if (activityStartCount == 1){//从后台切到前台if(mOnAppStatusListener != null){mOnAppStatusListener.onFront();}}}@Overridepublic void onActivityResumed(Activity activity) {}@Overridepublic void onActivityPaused(Activity activity) {}@Overridepublic void onActivityStopped(Activity activity) {activityStartCount--;//数量从1到0说明是从前台切到后台if (activityStartCount == 0){//从前台切到后台if(mOnAppStatusListener != null){mOnAppStatusListener.onBack();}}}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic void onActivityDestroyed(Activity activity) {}};public interface OnAppStatusListener{void onFront();void onBack();}}
- 新建一个继承Application的子类,并且通过AppFrontBackHelper注册自身的运行状态,此时再传入需要实现的业务,比如如果APP在前台运行,则隐藏导航栏、状态栏,反之则显示导航栏、状态栏。
贴上代码:
public class MyApp extends Application{private AppFrontBackHelper helper;@Overridepublic void onCreate() {super.onCreate();helper = new AppFrontBackHelper();helper.register(MyApp.this, new AppFrontBackHelper.OnAppStatusListener() {@Overridepublic void onFront() {//隐藏导航栏、状态栏Intent intent = new Intent();intent.setAction(\"hide.systemui\");sendBroadcast(intent);}@Overridepublic void onBack() {//显示导航栏、状态栏Intent intent = new Intent();intent.setAction(\"show.systemui\");sendBroadcast(intent);}});}@Overridepublic void onTerminate() {super.onTerminate();helper.unRegister(MyApp.this);}}
- 最后只需要在AndroidManifest.xml里面添加上这个子类:
<applicationandroid:name=\".MyApp\".......</application>