Escribe la serie APK sin enseñar nada sobre ingeniería inversa (ー ー ゛) ¡
Muchas gracias por tus tutoriales en Internet! !
¡Realmente depende de ti! ! ! ! (• ̥́ ˍ • ̀ू)
Ahora debemos hacer el curso de desarrollo de Android ~
Eche un vistazo a los puntos de inspección de Lab2 (realmente · nunca estudiado)
Tarea 1
Muy real atascado en Task1
1. Implemente el receptor, comience automáticamente después de arrancar y llame automáticamente al servicio
Idea : escriba un receptor, regístrese en el manifiesto para recibir la transmisión de inicio. Después de
recibir la transmisión, use una intención para iniciar un servicio
Manifiesto:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".SecretBootReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
receptor:
public class SecretBootReceiver extends BroadcastReceiver {
static final String ACTION = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION)){
Intent service= new Intent(context,SecretService.class);
service.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Log.e("TAG","receiver");
context.startService(service);
}
}}
Referencia : (Es el más amigable para Xiaobai que puedo encontrar ...) Arrancar y
ejecutar
https://www.cnblogs.com/Chenshuai7/p/5434868.html
Servicio de inicio
https://www.cnblogs.com/ guanxinjing / p / 9861476.html
2. Obtenga el posicionamiento GPS en servicio, brinde automáticamente cada tres segundos
La sensación de escribir completamente ciego ...
Idea : registre los permisos requeridos en el manifiesto, use LocationManager para realizar el posicionamiento, use requestLocationUpdates para volver a adquirir cada tres segundos y use toast para generar el
manifiesto:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
public class SecretService extends Service {
private LocationManager locationManager;
public void endService()
{
if(locationManager != null && locationListener != null)
{
locationManager.removeUpdates(locationListener);
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@SuppressLint("MissingPermission")
@Override
public void onCreate() {
super.onCreate();
Log.e("TAG", "service");
final LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
if (location != null) {
String latitude = Double.toString(location.getLatitude());//经度
String longitude = Double.toString(location.getLongitude());//纬度
String accuracy = Double.toString(location.getAccuracy());
Log.i("log", "Location changed : Lat: " + latitude + " Lng: " + longitude);
Toast.makeText(SecretService.this, "getAccuracy:" + accuracy + "\ngetLatitude:" + latitude + "\ngetLongitude:" + longitude, Toast.LENGTH_SHORT).show();
} else {
Log.i("log", "Location changed : Lat: " + "NULL" + " Lng: " + "NULL");
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
//实现每三秒重新获取
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 0, locationListener);
}
@Override
public void onDestroy()
{
endService();
}
private final LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
if (location != null) {
String latitude = Double.toString(location.getLatitude());
String longitude = Double.toString(location.getLongitude());
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
};
3. Obtenga acceso dinámico a los permisos al iniciar la aplicación por primera vez
private String[] permissions ={
Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.INTERNET};
for (int i = 1; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, permissions, i);
} else {
Intent intent = new Intent(MainActivity.this, MainActivity.class);
startService(intent);
}
Referencia:
https://blog.csdn.net/shen4402/article/details/78311124
Obtenga permiso
https://blog.csdn.net/ww897532167/article/details/70162678/
Efecto:
Tarea 2
El problema de los subprocesos para modificar la interfaz de usuario es el
mismo que la escritura a ciegas en emm
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setMessage(input);
builder.show();
}
};
handler.sendEmptyMessage(1);
Looper.loop();
tv.setText(input);
// Make a dialog rather than edit the text in main UI
}
}).start();
Referencia:
ventana emergente
https://www.cnblogs.com/javadongx/p/android_alert_message.html
interfaz de usuario de actualización de subproceso
https://blog.csdn.net/CVSDN/article/details/84879725
Efecto:
Task3
Examine principalmente el mecanismo de reflexión de Java, los tutoriales escritos por los grandes son fáciles de entender
PoRELab.publicMethod(input);
PoRELab obj1 = new PoRELab();
try {
Class<?> clazz = obj1.getClass();
System.out.println(clazz);
PoRELab obj2 = (PoRELab) clazz.newInstance();
Field field = clazz.getDeclaredField("curStr");
field.setAccessible(true);
String got = (String) (field).get(obj2);
Method method = clazz.getDeclaredMethod("privateMethod", String.class, String.class);
method.setAccessible(true);
method.invoke(obj2, "get private method", got);
} catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException | InstantiationException e) {
e.printStackTrace();
}
efecto:
Pensé que iba a terminar Lab2 en la calle ... ¿cómo se verá el laboratorio en la parte de atrás (• ̥́ ˍ • ̀ू) de
todos modos! ¡Inventa una lección sobre el desarrollo de Android! ! ! ! ¡Párate B y vete!