硬件平台:展锐
软件平台:Android11
近日,新做一需求,需要app间实现接口的调用,但是被调用app的功能接口却在activity类中实现,需求上看是需要被调用的app未启动也可以实现功能的调用,无奈,实现了自定义的广播,在广播里重新实现了activity类里边的功能,code如下:
diff --git a/vendor/sprd/platform/packages/apps/LogManager/src/com/sprd/logmanager/BootCompletedReceiver.java b/vendor/sprd/platform/packages/apps/LogManager/src/com/sprd/logmanager/BootCompletedReceiver.java
index 335af6dbab..c729b2b25f 100755
--- a/vendor/sprd/platform/packages/apps/LogManager/src/com/sprd/logmanager/BootCompletedReceiver.java
+++ b/vendor/sprd/platform/packages/apps/LogManager/src/com/sprd/logmanager/BootCompletedReceiver.java
@@ -14,7 +14,12 @@ import com.sprd.logmanager.logui.SceneInfo;
import com.sprd.logmanager.database.LogSceneManager;
import com.sprd.logmanager.database.LogManagerPreference;
import com.sprd.logmanager.logcopy.service.LogCopyService;
+import com.sprd.logmanager.utils.ShellUtils;
+import android.os.Message;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.HandlerThread;
public class BootCompletedReceiver extends BroadcastReceiver {
@@ -22,6 +27,11 @@ public class BootCompletedReceiver extends BroadcastReceiver {
private LogManagerPreference mLogManagerPreference;
private APLogControl mApLogControl;
+ private LogHandler mLogHandler;
+ HandlerThread mLogHandlerThread;
+
+
+ private static final int CLEAR_LOG = 0;
@Override
public void onReceive(Context context, Intent intent) {
@@ -73,9 +83,57 @@ public class BootCompletedReceiver extends BroadcastReceiver {
}).start();
}
public class BootCompletedReceiver extends BroadcastReceiver {
@@ -22,6 +27,11 @@ public class BootCompletedReceiver extends BroadcastReceiver {
private LogManagerPreference mLogManagerPreference;
private APLogControl mApLogControl;
+ private LogHandler mLogHandler;
+ HandlerThread mLogHandlerThread;
+
+
+ private static final int CLEAR_LOG = 0;
@Override
public void onReceive(Context context, Intent intent) {
@@ -73,9 +83,57 @@ public class BootCompletedReceiver extends BroadcastReceiver {
}).start();
}
}
+
+ if (action != null && action.equals("TAL.APP.REMOVE.YLOG")) {
+ if (null == mLogHandlerThread) {
+ mLogHandlerThread = new HandlerThread(TAG);
+ mLogHandlerThread.start();
+ }
+
+ if (null == mLogHandler) {
+ mLogHandler = new LogHandler(mLogHandlerThread.getLooper());
+ }
+
+ Message clearLog = mLogHandler
+ .obtainMessage(CLEAR_LOG);
+ mLogHandler.sendMessage(clearLog);
+ }
+
/* @} */
}
+ public void deleteYlogDir() {
+ try {
+ Log.d(TAG, "deleteYlogDirectoryOnly work!");
+ String[] logPaths = new String[] { "/data/ylog",
+ "/storage/emulated/0/ylog", "/storage/sdcard0/ylog" };
+ for (int i = 0; i < logPaths.length; i++) {
+ String cmd = String.format("rm -rf %s ", logPaths[i]);
+ ShellUtils.runCommand(cmd);
+ }
+ return;
+ } catch (Exception e) {
+ // TODO: handle exception
+ e.printStackTrace();
+ }
+ }
+
+ class LogHandler extends Handler {
+ public LogHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case CLEAR_LOG:
+ deleteYlogDir();
+ Log.d(TAG, "====== app want to clear log.");
+ break;
+ }
+ }
+ }
+
public void doBootAction(Context context){
/**
* create modem assert listener thread under situation as follow: 1.boot completed 2.when
diff --git a/vendor/sprd/platform/packages/apps/LogManager/user/AndroidManifest.xml b/vendor/sprd/platform/packages/apps/LogManager/user/AndroidManifest.xml
index cf150c1943..43385c05ab 100755
--- a/vendor/sprd/platform/packages/apps/LogManager/user/AndroidManifest.xml
+++ b/vendor/sprd/platform/packages/apps/LogManager/user/AndroidManifest.xml
@@ -92,6 +92,7 @@
android:directBootAware="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED" />
+ <action android:name="TAL.APP.REMOVE.YLOG" />
<action android:name="com.unisoc.cit.sprdylog" />
</intent-filter>
</receiver>
diff --git a/vendor/sprd/platform/packages/apps/LogManager/userdebug/AndroidManifest.xml b/vendor/sprd/platform/packages/apps/LogManager/userdebug/AndroidManifest.xml
index 5549984178..2bbee08000 100755
--- a/vendor/sprd/platform/packages/apps/LogManager/userdebug/AndroidManifest.xml
+++ b/vendor/sprd/platform/packages/apps/LogManager/userdebug/AndroidManifest.xml
@@ -90,6 +90,7 @@
android:directBootAware="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED" />
+ <action android:name="TAL.APP.REMOVE.YLOG" />
</intent-filter>
</receiver>
<provider android:name="com.sprd.logmanager.database.LogSceneProvider"
需要注意的点,就是广播需要注册为静态广播,否则app不启动无法响应,再就是注意广播的发送方需要添加intent字段才可以,示例如下:
1、使用am命令模拟如下:
adb shell am broadcast -n "com.autonavi.amapauto/com.autonavi.amapauto.adapter.internal.AmapAutoBroadcastReceiver"
2、代码实现如下:
private void setNaviCasualMute(int mute) {
Intent intent = new Intent();
intent.setClassName("com.autonavi.amapauto", "com.autonavi.amapauto.adapter.internal.AmapAutoBroadcastReceiver");
mContext.sendBroadcastAsUser(intent, UserHandle.SYSTEM);
}
Mark记录....