-
1.开机启动
前沿:一直做的是传统的APP,我是深恶痛绝这种流氓操作的,但是别人是工业软件,可以涉及到这方面的操作,我以传统的思维告诉面试官这个不能做,有点尴尬,后来查资料发现,只需要注册开机广播,并且手动打开自启动的权限就可以做到(米6的手机测试通过),以下是代码:
在manifest里面注册开机启动的广播
<receiver android:name=".AutoStartReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.HOME"/>
</intent-filter>
</receiver>
新建一个类AutoStartReceiver,用于接收开机启动的广播,并且启动自身的activity
public class AutoStartReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
最后重要的一部:打开手机的自启动权限,不然接收不到广播
- 2.熄屏启动,在屏幕熄掉以后在外部做一个类似于键盘解锁的界面,感觉需要做的应该是在点亮屏幕的时候拉活自己应用,然后做相关的处理(但是我在研究中发现监听灭屏和点亮屏幕的广播只能显示的注册,而且退出过后必须要销毁,不然应用回崩溃,目前还没有相关的解决方案。这里只做记录,待以后再做更新)
动态注册屏幕熄灭都点亮的广播
class MainActivity : AppCompatActivity() {
var receiver: ScreenBroadcastReceiver? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
receiver = ScreenBroadcastReceiver()
val filter = IntentFilter()
filter.addAction(Intent.ACTION_SCREEN_ON)
filter.addAction(Intent.ACTION_SCREEN_OFF)
filter.addAction(Intent.ACTION_USER_PRESENT)
registerReceiver(receiver, filter)
}
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(receiver!!)
}
}
编写收到广播后要执行的操作
public class ScreenBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "ScreenBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "onReceive");
String action = intent.getAction();
if (Intent.ACTION_SCREEN_ON.equals(action)) {
Log.d(TAG, "screen on");
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
Log.d(TAG, "screen off");
} else if (Intent.ACTION_USER_PRESENT.equals(action)) {
Log.d(TAG, "screen unlock");
}
}
}
- 3.检测APP端是否在线,应该采用心跳包机制,没几秒钟发送给服务端一个信号,我还在而已,并没有多少难度,但是犹豫一直没有经历过这个所以没有答出来,1年前我是听过的。。。
网友评论