From 2f019ae1767f65633878113046a2f9b138cbac52 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Tue, 4 Feb 2025 12:21:09 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=20WinBollActivity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apputils/build.properties | 4 +- .../java/cc/winboll/studio/apputils/App.java | 2 +- .../winboll/studio/apputils/MainActivity.java | 65 ++- .../TestStringToQrCodeViewActivity.java | 19 +- .../studio/apputils/TestWinBollActivity.java | 22 +- libapputils/build.properties | 4 +- .../libapputils/activities/AboutActivity.java | 33 +- .../activities/AssetsHtmlActivity.java | 19 +- .../activities/QRCodeDecodeActivity.java | 17 +- .../studio/libapputils/app/IWinBoll.java | 21 + .../libapputils/app/IWinBollActivity.java | 228 ++++++++ .../libapputils/app/WinBollActivity.java | 490 ------------------ .../app/WinBollActivityManager.java | 99 ++-- .../libapputils/app/WinBollFactory.java | 16 + .../studio/libapputils/log/LogActivity.java | 18 +- 15 files changed, 445 insertions(+), 612 deletions(-) create mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/app/IWinBoll.java create mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/app/IWinBollActivity.java delete mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/app/WinBollActivity.java create mode 100644 libapputils/src/main/java/cc/winboll/studio/libapputils/app/WinBollFactory.java diff --git a/apputils/build.properties b/apputils/build.properties index f7d0d76..a4e8992 100644 --- a/apputils/build.properties +++ b/apputils/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue Feb 04 08:54:19 HKT 2025 +#Tue Feb 04 04:18:10 GMT 2025 stageCount=1 libraryProject=libapputils baseVersion=9.3 publishVersion=9.3.0 -buildCount=0 +buildCount=21 baseBetaVersion=9.3.1 diff --git a/apputils/src/main/java/cc/winboll/studio/apputils/App.java b/apputils/src/main/java/cc/winboll/studio/apputils/App.java index 222f666..d0fbcf1 100644 --- a/apputils/src/main/java/cc/winboll/studio/apputils/App.java +++ b/apputils/src/main/java/cc/winboll/studio/apputils/App.java @@ -17,7 +17,7 @@ public class App extends WinBollGlobalApplication { @Override public void onCreate() { super.onCreate(); - Toast.makeText(getApplication(), "Toast Test", Toast.LENGTH_SHORT).show(); + //Toast.makeText(getApplication(), "Toast Test", Toast.LENGTH_SHORT).show(); } } diff --git a/apputils/src/main/java/cc/winboll/studio/apputils/MainActivity.java b/apputils/src/main/java/cc/winboll/studio/apputils/MainActivity.java index bc95219..b6ce025 100644 --- a/apputils/src/main/java/cc/winboll/studio/apputils/MainActivity.java +++ b/apputils/src/main/java/cc/winboll/studio/apputils/MainActivity.java @@ -6,35 +6,66 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; +import cc.winboll.studio.libapputils.activities.AboutActivity; import cc.winboll.studio.libapputils.activities.AssetsHtmlActivity; import cc.winboll.studio.libapputils.activities.QRCodeDecodeActivity; -import cc.winboll.studio.libapputils.app.WinBollActivity; +import cc.winboll.studio.libapputils.app.IWinBoll; import cc.winboll.studio.libapputils.app.WinBollActivityManager; +import cc.winboll.studio.libapputils.bean.APPInfo; import cc.winboll.studio.libapputils.log.LogActivity; import cc.winboll.studio.libapputils.log.LogUtils; import com.hjq.toast.ToastUtils; -import cc.winboll.studio.libapputils.activities.AboutActivity; -import cc.winboll.studio.libapputils.bean.APPInfo; +import cc.winboll.studio.libapputils.app.WinBollFactory; +import cc.winboll.studio.libapputils.app.IWinBollActivity; + +final public class MainActivity extends AppCompatActivity implements IWinBoll { -final public class MainActivity extends WinBollActivity { public static final String TAG = "MainActivity"; + + IWinBollActivity mIWinBollActivity; public static final int REQUEST_QRCODEDECODE_ACTIVITY = 0; @Override - protected boolean isEnableDisplayHomeAsUp() { + public AppCompatActivity getCurrentAppCompatActivity() { + return this; + } + + @Override + public String getTag() { + return TAG; + } + + @Override + public boolean isAddWinBollToolBar() { + ToastUtils.show(String.format("%s isAddWinBollToolBar()", TAG)); + return true; + } + + @Override + public Toolbar initToolBar() { + return findViewById(R.id.activitymainToolbar1); + } + + @Override + public boolean isEnableDisplayHomeAsUp() { return false; } @Override protected void onCreate(Bundle savedInstanceState) { + //ToastUtils.show("onCreate"); + mIWinBollActivity = WinBollFactory.buildWinBollActivity(this); + mIWinBollActivity.onCreate(savedInstanceState); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - - //Toolbar toolbar = findViewById(R.id.activitymainToolbar1); - //setActionBar(toolbar); + //ToastUtils.show("setContentView"); + + Toolbar toolbar = findViewById(R.id.activitymainToolbar1); + setSupportActionBar(toolbar); // 接收并处理 Intent 数据,函数 Intent 处理接收就直接返回 //if (prosessIntents(getIntent())) return; @@ -130,24 +161,12 @@ final public class MainActivity extends WinBollActivity { return true; } - @Override - public String getTag() { - return TAG; - } - - @Override - protected boolean isAddWinBollToolBar() { - return true; - } - - @Override - protected Toolbar initToolBar() { - return findViewById(R.id.activitymainToolbar1); - } @Override public boolean onCreateOptionsMenu(Menu menu) { + //ToastUtils.show("onCreateOptionsMenu"); getMenuInflater().inflate(R.menu.toolbar_main, menu); + mIWinBollActivity.inflateWinBollMenu(menu); return super.onCreateOptionsMenu(menu); } @@ -163,6 +182,8 @@ final public class MainActivity extends WinBollActivity { } else if(item.getItemId() == R.id.item_about) { openAboutActivity(); return true; + } else if(mIWinBollActivity.onOptionsItemSelected(item)) { + return true; } return super.onOptionsItemSelected(item); } diff --git a/apputils/src/main/java/cc/winboll/studio/apputils/TestStringToQrCodeViewActivity.java b/apputils/src/main/java/cc/winboll/studio/apputils/TestStringToQrCodeViewActivity.java index 06c80a3..7459bf5 100644 --- a/apputils/src/main/java/cc/winboll/studio/apputils/TestStringToQrCodeViewActivity.java +++ b/apputils/src/main/java/cc/winboll/studio/apputils/TestStringToQrCodeViewActivity.java @@ -1,19 +1,26 @@ package cc.winboll.studio.apputils; import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; -import cc.winboll.studio.libapputils.app.WinBollActivity; +import cc.winboll.studio.libapputils.app.IWinBoll; import cc.winboll.studio.libapputils.view.StringToQrCodeView; /** * @Author ZhanGSKen@QQ.COM * @Date 2025/01/17 19:50:46 */ -public class TestStringToQrCodeViewActivity extends WinBollActivity { +public class TestStringToQrCodeViewActivity extends AppCompatActivity implements IWinBoll { + public static final String TAG = "TestStringToQrCodeViewActivity"; StringToQrCodeView mStringToQrCodeView; + + @Override + public AppCompatActivity getCurrentAppCompatActivity() { + return this; + } @Override public String getTag() { @@ -21,17 +28,17 @@ public class TestStringToQrCodeViewActivity extends WinBollActivity { } @Override - protected Toolbar initToolBar() { + public Toolbar initToolBar() { return findViewById(R.id.activityteststringtoqrcodeviewToolbar1); } @Override - protected boolean isEnableDisplayHomeAsUp() { + public boolean isEnableDisplayHomeAsUp() { return true; } @Override - protected boolean isAddWinBollToolBar() { + public boolean isAddWinBollToolBar() { return true; } @@ -45,6 +52,6 @@ public class TestStringToQrCodeViewActivity extends WinBollActivity { @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); - setSubTitle(TAG); + //setSubTitle(TAG); } } diff --git a/apputils/src/main/java/cc/winboll/studio/apputils/TestWinBollActivity.java b/apputils/src/main/java/cc/winboll/studio/apputils/TestWinBollActivity.java index 91bc4b4..9492f9f 100644 --- a/apputils/src/main/java/cc/winboll/studio/apputils/TestWinBollActivity.java +++ b/apputils/src/main/java/cc/winboll/studio/apputils/TestWinBollActivity.java @@ -1,38 +1,40 @@ package cc.winboll.studio.apputils; -import android.content.Intent; import android.os.Bundle; -import android.view.View; +import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; -import cc.winboll.studio.libapputils.activities.AssetsHtmlActivity; -import cc.winboll.studio.libapputils.app.WinBollActivity; -import cc.winboll.studio.libapputils.app.WinBollActivityManager; +import cc.winboll.studio.libapputils.app.IWinBoll; /** * @Author ZhanGSKen@QQ.COM * @Date 2025/01/13 15:09:46 */ -public class TestWinBollActivity extends WinBollActivity { +public class TestWinBollActivity extends AppCompatActivity implements IWinBoll { public static final String TAG = "TestWinBollActivity"; + @Override + public AppCompatActivity getCurrentAppCompatActivity() { + return this; + } + @Override public String getTag() { return TAG; } @Override - protected Toolbar initToolBar() { + public Toolbar initToolBar() { return findViewById(R.id.activitytestwinbollToolbar1); } @Override - protected boolean isEnableDisplayHomeAsUp() { + public boolean isEnableDisplayHomeAsUp() { return true; } @Override - protected boolean isAddWinBollToolBar() { + public boolean isAddWinBollToolBar() { return true; } @@ -45,7 +47,7 @@ public class TestWinBollActivity extends WinBollActivity { @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); - setSubTitle(TAG); + //setSubTitle(TAG); } diff --git a/libapputils/build.properties b/libapputils/build.properties index 3e880f5..a4e8992 100644 --- a/libapputils/build.properties +++ b/libapputils/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue Feb 04 08:54:03 HKT 2025 +#Tue Feb 04 04:18:10 GMT 2025 stageCount=1 libraryProject=libapputils baseVersion=9.3 publishVersion=9.3.0 -buildCount=0 +buildCount=21 baseBetaVersion=9.3.1 diff --git a/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/AboutActivity.java b/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/AboutActivity.java index 108b628..d5626c8 100644 --- a/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/AboutActivity.java +++ b/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/AboutActivity.java @@ -10,15 +10,16 @@ import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.LinearLayout; +import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import cc.winboll.studio.libapputils.R; -import cc.winboll.studio.libapputils.app.WinBollActivity; +import cc.winboll.studio.libapputils.app.IWinBoll; import cc.winboll.studio.libapputils.app.WinBollActivityManager; import cc.winboll.studio.libapputils.bean.APPInfo; import cc.winboll.studio.libapputils.view.AboutView; import com.hjq.toast.ToastUtils; -final public class AboutActivity extends WinBollActivity { +final public class AboutActivity extends AppCompatActivity implements IWinBoll { public static final String TAG = "AboutActivity"; public static final String EXTRA_APPINFO = "EXTRA_APPINFO"; @@ -26,16 +27,31 @@ final public class AboutActivity extends WinBollActivity { APPInfo mAPPInfo; + @Override + public AppCompatActivity getCurrentAppCompatActivity() { + return this; + } + @Override public String getTag() { return TAG; } @Override - protected boolean isEnableDisplayHomeAsUp() { + public boolean isEnableDisplayHomeAsUp() { return true; } + @Override + public boolean isAddWinBollToolBar() { + return false; + } + + @Override + public Toolbar initToolBar() { + return findViewById(R.id.activityaboutToolbar1); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -58,18 +74,9 @@ final public class AboutActivity extends WinBollActivity { @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); - setSubTitle(TAG); + //setSubTitle(TAG); } - @Override - protected boolean isAddWinBollToolBar() { - return false; - } - - @Override - protected Toolbar initToolBar() { - return findViewById(R.id.activityaboutToolbar1); - } @Override public boolean onCreateOptionsMenu(Menu menu) { diff --git a/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/AssetsHtmlActivity.java b/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/AssetsHtmlActivity.java index f86b035..532e7f0 100644 --- a/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/AssetsHtmlActivity.java +++ b/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/AssetsHtmlActivity.java @@ -13,15 +13,17 @@ import android.view.Menu; import android.view.MenuItem; import androidx.appcompat.widget.Toolbar; import cc.winboll.studio.libapputils.R; -import cc.winboll.studio.libapputils.app.WinBollActivity; +import cc.winboll.studio.libapputils.app.IWinBollActivity; import cc.winboll.studio.libapputils.log.LogUtils; import cc.winboll.studio.libapputils.view.SimpleWebView; import com.hjq.toast.ToastUtils; import java.io.IOException; import java.io.InputStream; import android.os.PersistableBundle; +import androidx.appcompat.app.AppCompatActivity; +import cc.winboll.studio.libapputils.app.IWinBoll; -public class AssetsHtmlActivity extends WinBollActivity { +public class AssetsHtmlActivity extends AppCompatActivity implements IWinBoll { public static final String TAG = "AssetsHtmlActivity"; @@ -34,24 +36,29 @@ public class AssetsHtmlActivity extends WinBollActivity { // Assets 文件夹里的 Html 文件的名称 String mszHtmlFileName; + @Override + public AppCompatActivity getCurrentAppCompatActivity() { + return this; + } + @Override public String getTag() { return TAG; } @Override - protected boolean isEnableDisplayHomeAsUp() { + public boolean isEnableDisplayHomeAsUp() { return true; } @Override - protected boolean isAddWinBollToolBar() { + public boolean isAddWinBollToolBar() { return false; } @Override - protected Toolbar initToolBar() { + public Toolbar initToolBar() { return findViewById(R.id.activityassetshtmlToolbar1); } @@ -110,7 +117,7 @@ public class AssetsHtmlActivity extends WinBollActivity { @Override public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) { super.onPostCreate(savedInstanceState, persistentState); - setSubTitle(mszHtmlFileName); + //setSubTitle(mszHtmlFileName); //setSubTitle(TAG); } diff --git a/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/QRCodeDecodeActivity.java b/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/QRCodeDecodeActivity.java index a0d979c..b7627b2 100644 --- a/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/QRCodeDecodeActivity.java +++ b/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/QRCodeDecodeActivity.java @@ -9,18 +9,20 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import cc.winboll.studio.libapputils.R; -import cc.winboll.studio.libapputils.app.WinBollActivity; +import cc.winboll.studio.libapputils.app.IWinBoll; import com.google.zxing.ResultPoint; import com.journeyapps.barcodescanner.BarcodeCallback; import com.journeyapps.barcodescanner.BarcodeResult; import com.journeyapps.barcodescanner.DecoratedBarcodeView; import java.util.List; -public class QRCodeDecodeActivity extends WinBollActivity { +public class QRCodeDecodeActivity extends AppCompatActivity implements IWinBoll { + public static final String TAG = "QRCodeDecodeActivity"; public static final String EXTRA_RESULT = "EXTRA_RESULT"; @@ -28,6 +30,11 @@ public class QRCodeDecodeActivity extends WinBollActivity { private static final int REQUEST_CAMERA_PERMISSION = 1; TextView resultTextView; DecoratedBarcodeView barcodeView; + + @Override + public AppCompatActivity getCurrentAppCompatActivity() { + return this; + } @Override public String getTag() { @@ -35,18 +42,18 @@ public class QRCodeDecodeActivity extends WinBollActivity { } @Override - protected boolean isEnableDisplayHomeAsUp() { + public boolean isEnableDisplayHomeAsUp() { return true; } @Override - protected boolean isAddWinBollToolBar() { + public boolean isAddWinBollToolBar() { return false; } @Override - protected Toolbar initToolBar() { + public Toolbar initToolBar() { return findViewById(R.id.activityqrcodedecodeToolbar1); } diff --git a/libapputils/src/main/java/cc/winboll/studio/libapputils/app/IWinBoll.java b/libapputils/src/main/java/cc/winboll/studio/libapputils/app/IWinBoll.java new file mode 100644 index 0000000..1b60140 --- /dev/null +++ b/libapputils/src/main/java/cc/winboll/studio/libapputils/app/IWinBoll.java @@ -0,0 +1,21 @@ +package cc.winboll.studio.libapputils.app; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + +/** + * @Author ZhanGSKen@QQ.COM + * @Date 2025/02/04 10:20:16 + * @Describe WinBoll Activity 接口 + */ +public interface IWinBoll { + + public static final String TAG = "IWinBoll"; + + // 获取当前具有 IWinBoll 特征的 AppCompatActivity 活动窗口 + AppCompatActivity getCurrentAppCompatActivity(); + + abstract public String getTag(); + abstract Toolbar initToolBar(); + abstract boolean isEnableDisplayHomeAsUp(); + abstract boolean isAddWinBollToolBar(); +} diff --git a/libapputils/src/main/java/cc/winboll/studio/libapputils/app/IWinBollActivity.java b/libapputils/src/main/java/cc/winboll/studio/libapputils/app/IWinBollActivity.java new file mode 100644 index 0000000..e516d83 --- /dev/null +++ b/libapputils/src/main/java/cc/winboll/studio/libapputils/app/IWinBollActivity.java @@ -0,0 +1,228 @@ +package cc.winboll.studio.libapputils.app; + +/** + * @Author ZhanGSKen@QQ.COM + * @Date 2024/08/12 14:32:08 + * @Describe WinBoll 活动窗口基础类 + */ +import android.content.ComponentName; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.net.Uri; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import cc.winboll.studio.libapputils.R; +import cc.winboll.studio.libapputils.activities.AboutActivity; +import cc.winboll.studio.libapputils.log.LogActivity; +import cc.winboll.studio.libapputils.log.LogUtils; +import cc.winboll.studio.libapputils.view.AboutView; +import com.hjq.toast.ToastUtils; +import java.util.List; +import java.util.Set; + +public class IWinBollActivity { + + public static final String TAG = "WinBollActivity"; + + public static final int REQUEST_LOG_ACTIVITY = 0; + + IWinBoll mIWinBoll; + AppCompatActivity mCurrentAppCompatActivity; + + Toolbar mToolBar; + + public IWinBollActivity(IWinBoll iWinBoll) { + mIWinBoll = iWinBoll; + mCurrentAppCompatActivity = (AppCompatActivity)iWinBoll; + } + + public void onCreate(Bundle savedInstanceState) { + checkResolveActivity(); + LogUtils.d(TAG, "onCreate"); + //super.onCreate(savedInstanceState); + archiveInstance(); + + } + + boolean checkResolveActivity() { + PackageManager packageManager = mCurrentAppCompatActivity.getPackageManager(); + //Intent intent = new Intent("your_action_here"); + Intent intent = mCurrentAppCompatActivity.getIntent(); + if (intent != null) { + List resolveInfoList = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); + if (resolveInfoList.size() > 0) { + // 传入的Intent action在Activity清单的intent-filter的action节点里有定义 + if (intent.getAction() != null) { + if (intent.getAction().equals(cc.winboll.studio.libapputils.intent.action.DEBUGVIEW)) { + WinBollGlobalApplication.setIsDebug(true); + //ToastUtils.show!("WinBollApplication.setIsDebug(true) by action : " + intent.getAction()); + + } + } + return true; + } else { + // 传入的Intent action在Activity清单的intent-filter的action节点里没有定义 + //ToastUtils.show("false : " + intent.getAction()); + return false; + } + + } + + // action在清单文件中没有声明 + ToastUtils.show("false"); + return false; + } + + void archiveInstance() { + Intent intent = mCurrentAppCompatActivity.getIntent(); + StringBuilder sb = new StringBuilder("\n### Archive Instance ###\n"); + + if (intent != null) { + ComponentName componentName = intent.getComponent(); + if (componentName != null) { + String packageName = componentName.getPackageName(); + //Log.d("AppStarter", "启动本应用的应用包名: " + packageName); + sb.append("启动本应用的应用包名: \n" + packageName); + } + + sb.append("\nImplicit Intent Tracker :\n接收到的 Intent 动作: \n" + intent.getAction()); + Set categories = intent.getCategories(); + if (categories != null) { + for (String category : categories) { + sb.append("\n接收到的 Intent 类别 :\n" + category); + } + } + Uri data = intent.getData(); + if (data != null) { + sb.append("\n接收到的 Intent 数据 :\n" + data.toString()); + } + } else { + sb.append("Intent is null."); + } + sb.append("\n\n"); + LogUtils.d(TAG, sb.toString()); + } + + public void onPostCreate(Bundle savedInstanceState) { + mToolBar = mIWinBoll.initToolBar(); + mCurrentAppCompatActivity.setSupportActionBar(mToolBar); + if (mIWinBoll.isEnableDisplayHomeAsUp() && mToolBar != null) { + // 显示后退按钮 + mCurrentAppCompatActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + + // 缓存当前 activity + LogUtils.d(TAG, "ActManager.getInstance().add(this);"); + //ToastUtils.show("getTag() " + getTag()); + WinBollActivityManager.getInstance(mCurrentAppCompatActivity).add(mIWinBoll); + + mCurrentAppCompatActivity.getSupportActionBar().setSubtitle(mIWinBoll.getTag()); + } + + public void onDestroy() { + WinBollActivityManager.getInstance(mCurrentAppCompatActivity).registeRemove(mIWinBoll); + } + + + public void inflateWinBollMenu(Menu menu) { + if (mIWinBoll.isAddWinBollToolBar()) { + mCurrentAppCompatActivity.getMenuInflater().inflate(R.menu.toolbar_winboll_shared_main, menu); + } + if (WinBollGlobalApplication.isDebug()) { + mCurrentAppCompatActivity.getMenuInflater().inflate(R.menu.toolbar_studio_debug, menu); + } + } + + public boolean onOptionsItemSelected(MenuItem item) { + LogUtils.d(TAG, "onOptionsItemSelected"); + if (item.getItemId() == R.id.item_testcrashreport) { + for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) { + mCurrentAppCompatActivity.getString(i); + } + } else if (item.getItemId() == R.id.item_log) { +// LogUtils.d(TAG, "item_log not yet."); +// Intent intent = new Intent(this, LogActivity.class); +// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); +// intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); +// startActivity(intent); + + //WinBollActivityManager.getInstance().printAvtivityListInfo(); + WinBollActivityManager.getInstance(mCurrentAppCompatActivity).startWinBollActivity(mCurrentAppCompatActivity, LogActivity.class); + } else if (item.getItemId() == R.id.item_exit) { + //ToastUtils.show("item_exit"); + WinBollActivityManager.getInstance(mCurrentAppCompatActivity).finishAll(); + } else if (item.getItemId() == R.id.item_info) { + LogUtils.d(TAG, "item_info not yet."); + //WinBollApplication application = (WinBollApplication) getApplication(); + //application.getMyActivityLifecycleCallbacks().showActivityeInfo(); + } else if (item.getItemId() == R.id.item_exitdebug) { + AboutView.setApp2NormalMode(mCurrentAppCompatActivity); + } else if (item.getItemId() == R.id.item_about) { + startAboutActivity(); + } else if (item.getItemId() == android.R.id.home) { + WinBollActivityManager.getInstance(mCurrentAppCompatActivity).finish(mIWinBoll); + } + // else if (item.getItemId() == android.R.id.home) { + // 回到主窗口速度缓慢,方法备用。现在用 WinBollActivityManager resumeActivity 和 finish 方法管理。 + // _mMainWinBollActivity 是 WinBollActivity 的静态属性 + // onCreate 函数下 _mMainWinBollActivity 为空时就用 _mMainWinBollActivity = this 赋值。 + //startWinBollActivity(new Intent(_mMainWinBollActivity, _mMainWinBollActivity.getClass()), _mMainWinBollActivity.getTag(), _mMainWinBollActivity); + //} + return true; + } + + public boolean isAddWinBollInfoMenu() { + return true; + } + + public void onBackPressed() { + //super.onBackPressed(); + //ToastUtils.show("onBackPressed"); + WinBollActivityManager.getInstance(mCurrentAppCompatActivity).finish(mIWinBoll); + } + + + // + // activity: 为 null 时, + // intent.putExtra 函数 "tag" 参数为 tag + // activity: 不为 null 时, + // intent.putExtra 函数 "tag" 参数为 activity.getTag() + // + public void startAboutActivity() { + Intent intent = new Intent(mCurrentAppCompatActivity, AboutActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); + intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + intent.putExtra("tag", AboutActivity.TAG); + mCurrentAppCompatActivity.startActivity(intent); + } + +// @Override +// public void startActivity(Intent intent) { +// //绑定唯一标识 tag,存在 则根据 taskId 移动到前台 +// String tag = intent.getStringExtra("tag"); +// //ToastUtils.show("startActivityForResult tag " + tag); +// //WinBollActivityManager.getInstance(this).printAvtivityListInfo(); +// if (WinBollActivityManager.getInstance(this).isActive(tag)) { +// //ToastUtils.show("resumeActivity"); +// LogUtils.d(TAG, "resumeActivity"); +// WinBollActivityManager.getInstance(this).resumeActivity(this, tag); +// } else { +// //ToastUtils.show("super.startActivity(intent);"); +// super.startActivity(intent); +// } +// } + + public void onActivityResult(int requestCode, int targetFragment, Intent data) { + LogUtils.d(TAG, "onActivityResult"); + switch (requestCode) { + case REQUEST_LOG_ACTIVITY : { + LogUtils.d(TAG, "REQUEST_LOG_ACTIVITY"); + break; + } + } + } +} diff --git a/libapputils/src/main/java/cc/winboll/studio/libapputils/app/WinBollActivity.java b/libapputils/src/main/java/cc/winboll/studio/libapputils/app/WinBollActivity.java deleted file mode 100644 index 417d83f..0000000 --- a/libapputils/src/main/java/cc/winboll/studio/libapputils/app/WinBollActivity.java +++ /dev/null @@ -1,490 +0,0 @@ -package cc.winboll.studio.libapputils.app; - -/** - * @Author ZhanGSKen@QQ.COM - * @Date 2024/08/12 14:32:08 - * @Describe WinBoll 活动窗口基础类 - */ -import android.app.Activity; -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.content.res.Resources; -import android.net.Uri; -import android.os.Bundle; -import android.os.Handler; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import cc.winboll.studio.libapputils.R; -import cc.winboll.studio.libapputils.activities.AboutActivity; -import cc.winboll.studio.libapputils.log.LogActivity; -import cc.winboll.studio.libapputils.log.LogUtils; -import cc.winboll.studio.libapputils.view.AboutView; -import com.hjq.toast.ToastUtils; -import java.util.List; -import java.util.Set; - -abstract public class WinBollActivity extends AppCompatActivity { - - public static final String TAG = "WinBollActivity"; - - public static final int REQUEST_LOG_ACTIVITY = 0; - - Toolbar mToolBar; - - @Override - protected void onCreate(Bundle savedInstanceState) { - checkResolveActivity(); - LogUtils.d(TAG, "onCreate"); - super.onCreate(savedInstanceState); - archiveInstance(); - - } - - boolean checkResolveActivity() { - PackageManager packageManager = getPackageManager(); - //Intent intent = new Intent("your_action_here"); - Intent intent = getIntent(); - if (intent != null) { - List resolveInfoList = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); - if (resolveInfoList.size() > 0) { - // 传入的Intent action在Activity清单的intent-filter的action节点里有定义 - if (intent.getAction() != null) { - if (intent.getAction().equals(cc.winboll.studio.libapputils.intent.action.DEBUGVIEW)) { - WinBollGlobalApplication.setIsDebug(true); - //ToastUtils.show!("WinBollApplication.setIsDebug(true) by action : " + intent.getAction()); - - } - } - return true; - } else { - // 传入的Intent action在Activity清单的intent-filter的action节点里没有定义 - //ToastUtils.show("false : " + intent.getAction()); - return false; - } - - /* ResolveInfo resolveInfo = pm.resolveActivity(intent, 0); - if (resolveInfo != null) { - // action在清单文件中有声明 - - } else { - - }*/ - } - - // action在清单文件中没有声明 - ToastUtils.show("false"); - return false; - } - - void archiveInstance() { - Intent intent = getIntent(); - StringBuilder sb = new StringBuilder("\n### Archive Instance ###\n"); - - if (intent != null) { - ComponentName componentName = intent.getComponent(); - if (componentName != null) { - String packageName = componentName.getPackageName(); - //Log.d("AppStarter", "启动本应用的应用包名: " + packageName); - sb.append("启动本应用的应用包名: \n" + packageName); - } - - sb.append("\nImplicit Intent Tracker :\n接收到的 Intent 动作: \n" + intent.getAction()); - Set categories = intent.getCategories(); - if (categories != null) { - for (String category : categories) { - sb.append("\n接收到的 Intent 类别 :\n" + category); - } - } - Uri data = intent.getData(); - if (data != null) { - sb.append("\n接收到的 Intent 数据 :\n" + data.toString()); - } - } else { - sb.append("Intent is null."); - } - sb.append("\n\n"); - LogUtils.d(TAG, sb.toString()); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - mToolBar = initToolBar(); - setSupportActionBar(mToolBar); - if (isEnableDisplayHomeAsUp() && mToolBar != null) { - // 显示后退按钮 - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - - // 缓存当前 activity - LogUtils.d(TAG, "ActManager.getInstance().add(this);"); - //ToastUtils.show("getTag() " + getTag()); - WinBollActivityManager.getInstance(this).add(this); - //WinBollActivityManager.getInstance().printAvtivityListInfo(); - //ToastUtils.show("WinBollUI_TYPE " + WinBollApplication.getWinBollUI_TYPE()); - //boolean isDebuging = WinBollApplication.loadDebugStatusIsDebuging(); - //ToastUtils.show(String.valueOf(isDebuging)); - //WinBollApplication.setIsDebug(true); - - setSubTitle(getTag()); - } - - @Override - public void recreate() { - super.recreate(); - } - - @Override - protected void onDestroy() { - WinBollActivityManager.getInstance(this).registeRemove(this); - super.onDestroy(); - } - - @Override - public void setContentView(int layoutResID) { - super.setContentView(layoutResID); - } - - @Override - public T findViewById(int id) { - return super.findViewById(id); - } - - @Override - public MenuInflater getMenuInflater() { - return super.getMenuInflater(); - } - - public WinBollActivity getActivity() { - return this; - } - - @Override - public Context getApplicationContext() { - return super.getApplicationContext(); - } - - public T getWinBollActivitySupportFragmentManager() { - return (T)super.getSupportFragmentManager(); - } - - @Override - public ActionBar getSupportActionBar() { - return super.getSupportActionBar(); - } - - @Override - public void setSupportActionBar(Toolbar toolbar) { - super.setSupportActionBar(toolbar); - } - - @Override - public void setActionBar(android.widget.Toolbar toolbar) { - super.setActionBar(toolbar); - } - - public void setSubTitle(CharSequence title) { - LogUtils.d(TAG, "setSubTitle"); - if (super.getSupportActionBar() != null) { - super.getSupportActionBar().setSubtitle(title); - LogUtils.d(TAG, String.format("setSubtitle title : %s", title)); - } - } - - public CharSequence getSubTitle() { - if (super.getSupportActionBar() != null) { - return super.getSupportActionBar().getSubtitle(); - } - return ""; - } - - @Override - public void setTitle(CharSequence title) { - //super.setTitle(title); - if (super.getSupportActionBar() != null) { - super.getSupportActionBar().setTitle(title); - LogUtils.d(TAG, String.format("setSubtitle title : %s", title)); - } - } - - @Override - public void setTitle(int titleId) { - //super.setTitle(titleId); - if (super.getSupportActionBar() != null) { - super.getSupportActionBar().setTitle(titleId); - //LogUtils.d(TAG, String.format("setSubtitle title : %s", title)); - } - } - - @Override - public void setTheme(Resources.Theme theme) { - super.setTheme(theme); - } - - @Override - public void setTheme(int resid) { - super.setTheme(resid); - } - - @Override - public void setTitleColor(int textColor) { - super.setTitleColor(textColor); - } - - @Override - public void setContentView(View view, ViewGroup.LayoutParams params) { - super.setContentView(view, params); - } - - @Override - public void setContentView(View view) { - super.setContentView(view); - } - - @Override - public SharedPreferences getSharedPreferences(String name, int mode) { - return super.getSharedPreferences(name, mode); - } - - - @Override - public boolean releaseInstance() { - return super.releaseInstance(); - } - - @Override - public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) { - return super.registerReceiver(receiver, filter, flags); - } - - @Override - public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler) { - return super.registerReceiver(receiver, filter, broadcastPermission, scheduler); - } - - @Override - public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler, int flags) { - return super.registerReceiver(receiver, filter, broadcastPermission, scheduler, flags); - } - - @Override - public void startActivities(Intent[] intents) { - super.startActivities(intents); - } - - @Override - public void startActivityFromFragment(Fragment fragment, Intent intent, int requestCode) { - super.startActivityFromFragment(fragment, intent, requestCode); - } - - @Override - public void startActivityFromFragment(android.app.Fragment fragment, Intent intent, int requestCode, Bundle options) { - super.startActivityFromFragment(fragment, intent, requestCode, options); - } - - @Override - public void startActivityFromChild(Activity child, Intent intent, int requestCode, Bundle options) { - super.startActivityFromChild(child, intent, requestCode, options); - } - - @Override - public void startActivities(Intent[] intents, Bundle options) { - super.startActivities(intents, options); - } - - @Override - public boolean startActivityIfNeeded(Intent intent, int requestCode) { - return super.startActivityIfNeeded(intent, requestCode); - } - - @Override - public boolean startActivityIfNeeded(Intent intent, int requestCode, Bundle options) { - return super.startActivityIfNeeded(intent, requestCode, options); - } - - @Override - public void startActivityFromChild(Activity child, Intent intent, int requestCode) { - super.startActivityFromChild(child, intent, requestCode); - } - - @Override - public ComponentName startService(Intent service) { - return super.startService(service); - } - - @Override - public void startActivityForResult(Intent intent, int requestCode) { - super.startActivityForResult(intent, requestCode); - } - - @Override - public void startActivityForResult(Intent intent, int requestCode, Bundle options) { - super.startActivityForResult(intent, requestCode, options); - } - - @Override - public void startActivityFromFragment(android.app.Fragment fragment, Intent intent, int requestCode) { - super.startActivityFromFragment(fragment, intent, requestCode); - } - - @Override - public void startActivityFromFragment(Fragment requestIndex, Intent fragment, int intent, Bundle requestCode) { - super.startActivityFromFragment(requestIndex, fragment, intent, requestCode); - } - - @Override - public void startActivity(Intent intent, Bundle options) { - super.startActivity(intent, options); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - if (isAddWinBollToolBar()) { - getMenuInflater().inflate(R.menu.toolbar_winboll_shared_main, menu); - } - if (WinBollGlobalApplication.isDebug()) { - getMenuInflater().inflate(R.menu.toolbar_studio_debug, menu); - } - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - LogUtils.d(TAG, "onOptionsItemSelected"); - if (item.getItemId() == R.id.item_testcrashreport) { - for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) { - getString(i); - } - } else if (item.getItemId() == R.id.item_log) { -// LogUtils.d(TAG, "item_log not yet."); -// Intent intent = new Intent(this, LogActivity.class); -// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); -// intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); -// startActivity(intent); - - //WinBollActivityManager.getInstance().printAvtivityListInfo(); - WinBollActivityManager.getInstance(this).startWinBollActivity(this, LogActivity.class); - } else if (item.getItemId() == R.id.item_exit) { - //ToastUtils.show("item_exit"); - WinBollActivityManager.getInstance(this).finishAll(); - } else if (item.getItemId() == R.id.item_info) { - LogUtils.d(TAG, "item_info not yet."); - //WinBollApplication application = (WinBollApplication) getApplication(); - //application.getMyActivityLifecycleCallbacks().showActivityeInfo(); - } else if (item.getItemId() == R.id.item_exitdebug) { - AboutView.setApp2NormalMode(getApplicationContext()); - } else if (item.getItemId() == R.id.item_about) { - startAboutActivity(); - } else if (item.getItemId() == android.R.id.home) { - WinBollActivityManager.getInstance(this).finish(this); - } - // else if (item.getItemId() == android.R.id.home) { - // 回到主窗口速度缓慢,方法备用。现在用 WinBollActivityManager resumeActivity 和 finish 方法管理。 - // _mMainWinBollActivity 是 WinBollActivity 的静态属性 - // onCreate 函数下 _mMainWinBollActivity 为空时就用 _mMainWinBollActivity = this 赋值。 - //startWinBollActivity(new Intent(_mMainWinBollActivity, _mMainWinBollActivity.getClass()), _mMainWinBollActivity.getTag(), _mMainWinBollActivity); - //} - return super.onOptionsItemSelected(item); - } - - @Override - public void onBackPressed() { - //super.onBackPressed(); - //ToastUtils.show("onBackPressed"); - WinBollActivityManager.getInstance(this).finish(this); - } - - - /*public void getInstanse() { - startWinBollActivity(new Intent(), getTag(), null); - }*/ - - // - // activity: 为 null 时, - // intent.putExtra 函数 "tag" 参数为 tag - // activity: 不为 null 时, - // intent.putExtra 函数 "tag" 参数为 activity.getTag() - // -// protected void startWinBollActivity(Intent intent, String tag, T activity) { -// LogUtils.d(TAG, "startWinBollActivityForResult tag " + tag); -// //ToastUtils.show("startWinBollActivityForResult tag " + tag); -// //打开多任务窗口 flags -// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); -// intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); -// if (activity != null) { -// intent.putExtra("tag", activity.getTag()); -// } else { -// intent.putExtra("tag", tag); -// } -// //ToastUtils.show("super.startActivityForResult(intent, requestCode); tag " + tag); -// LogUtils.d(TAG, "startActivityForResult(intent, requestCode);" + tag); -// startActivity(intent); -// } - - // - // activity: 为 null 时, - // intent.putExtra 函数 "tag" 参数为 tag - // activity: 不为 null 时, - // intent.putExtra 函数 "tag" 参数为 activity.getTag() - // - protected void startAboutActivity() { - Intent intent = new Intent(this, AboutActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); - intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); - intent.putExtra("tag", AboutActivity.TAG); - startActivity(intent); - } - - @Override - public void startActivity(Intent intent) { - //绑定唯一标识 tag,存在 则根据 taskId 移动到前台 - String tag = intent.getStringExtra("tag"); - //ToastUtils.show("startActivityForResult tag " + tag); - //WinBollActivityManager.getInstance(this).printAvtivityListInfo(); - if (WinBollActivityManager.getInstance(this).isActive(tag)) { - //ToastUtils.show("resumeActivity"); - LogUtils.d(TAG, "resumeActivity"); - WinBollActivityManager.getInstance(this).resumeActivity(this, tag); - } else { - //ToastUtils.show("super.startActivity(intent);"); - super.startActivity(intent); - } - } - - @Override - protected void onActivityResult(int requestCode, int targetFragment, Intent data) { - LogUtils.d(TAG, "onActivityResult"); - switch (requestCode) { - case REQUEST_LOG_ACTIVITY : { - LogUtils.d(TAG, "REQUEST_LOG_ACTIVITY"); - break; - } - default : { - super.onActivityResult(requestCode, targetFragment, data); - } - } - } - - public boolean isAddWinBollInfoMenu() { - return true; - } - - abstract public String getTag(); - abstract protected Toolbar initToolBar(); - abstract protected boolean isEnableDisplayHomeAsUp(); - abstract protected boolean isAddWinBollToolBar(); -} diff --git a/libapputils/src/main/java/cc/winboll/studio/libapputils/app/WinBollActivityManager.java b/libapputils/src/main/java/cc/winboll/studio/libapputils/app/WinBollActivityManager.java index d2a52f0..e9bd071 100644 --- a/libapputils/src/main/java/cc/winboll/studio/libapputils/app/WinBollActivityManager.java +++ b/libapputils/src/main/java/cc/winboll/studio/libapputils/app/WinBollActivityManager.java @@ -11,6 +11,7 @@ package cc.winboll.studio.libapputils.app; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; +import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.TaskStackBuilder; import cc.winboll.studio.libapputils.log.LogUtils; import java.util.HashMap; @@ -24,12 +25,12 @@ public class WinBollActivityManager { Context mContext; static WinBollActivityManager _mWinBollActivityManager; - static Map _mapActivityList; + static Map _mapIWinBollList; public WinBollActivityManager(Context context) { mContext = context; LogUtils.d(TAG, "WinBollActivityManager()"); - _mapActivityList = new HashMap(); + _mapIWinBollList = new HashMap(); } public static synchronized WinBollActivityManager getInstance(Context context) { @@ -44,12 +45,12 @@ public class WinBollActivityManager { // // 把Activity添加到管理中 // - public void add(T activity) { - if (isActive(activity.getTag())) { - LogUtils.d(TAG, String.format("add(...) %s is active.", activity.getTag())); + public void add(T iWinBoll) { + if (isActive(iWinBoll.getTag())) { + LogUtils.d(TAG, String.format("add(...) %s is active.", iWinBoll.getTag())); } else { - _mapActivityList.put(activity.getTag(), activity); - LogUtils.d(TAG, String.format("Add activity : %s\n_mapActivityList.size() : %d", activity.getTag(), _mapActivityList.size())); + _mapIWinBollList.put(iWinBoll.getTag(), iWinBoll); + LogUtils.d(TAG, String.format("Add activity : %s\n_mapActivityList.size() : %d", iWinBoll.getTag(), _mapIWinBollList.size())); } } @@ -60,7 +61,7 @@ public class WinBollActivityManager { // activity: 不为 null 时, // intent.putExtra 函数 "tag" 参数为 activity.getTag() // - public void startWinBollActivity(Context context, Class clazz) { + public void startWinBollActivity(Context context, Class clazz) { try { // 如果窗口已存在就重启窗口 String tag = clazz.newInstance().getTag(); @@ -81,7 +82,7 @@ public class WinBollActivityManager { } } - public void startWinBollActivity(Context context, Intent intent, Class clazz) { + public void startWinBollActivity(Context context, Intent intent, Class clazz) { try { // 如果窗口已存在就重启窗口 String tag = clazz.newInstance().getTag(); @@ -107,13 +108,13 @@ public class WinBollActivityManager { // public boolean isActive(String tag) { //printAvtivityListInfo(); - WinBollActivity activity = getWinBollActivity(tag); - if (activity != null) { + IWinBoll iWinBoll = getIWinBoll(tag); + if (iWinBoll != null) { LogUtils.d(TAG, "isActive(...) activity != null tag " + tag); //ToastUtils.show("activity != null tag " + tag); //判断是否为 BaseActivity,如果已经销毁,则移除 - if (activity.isFinishing() || activity.isDestroyed()) { - _mapActivityList.remove(activity.getTag()); + if (iWinBoll.getCurrentAppCompatActivity().isFinishing() || iWinBoll.getCurrentAppCompatActivity().isDestroyed()) { + _mapIWinBollList.remove(iWinBoll.getTag()); //_mWinBollActivityList.remove(activity); LogUtils.d(TAG, String.format("isActive(...) remove activity.\ntag : %s", tag)); return false; @@ -127,36 +128,36 @@ public class WinBollActivityManager { } } - static WinBollActivity getWinBollActivity(String tag) { - return _mapActivityList.get(tag); + static IWinBoll getIWinBoll(String tag) { + return _mapIWinBollList.get(tag); } // // 找到tag 绑定的 BaseActivity ,通过 getTaskId() 移动到前台 // - public void resumeActivity(Context context, String tag) { + public void resumeActivity(Context context, String tag) { LogUtils.d(TAG, "resumeActivty"); - T activity = (T)getWinBollActivity(tag); + T iWinBoll = (T)getIWinBoll(tag); //LogUtils.d(TAG, "activity " + activity.getTag()); - if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) { - resumeActivity(context, activity); + if (iWinBoll != null && !iWinBoll.getCurrentAppCompatActivity().isFinishing() && !iWinBoll.getCurrentAppCompatActivity().isDestroyed()) { + resumeActivity(context, iWinBoll); } } // // 找到tag 绑定的 BaseActivity ,通过 getTaskId() 移动到前台 // - public void resumeActivity(Context context, T activity) { - ActivityManager am = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE); + public void resumeActivity(Context context, T iWinBoll) { + ActivityManager am = (ActivityManager) iWinBoll.getCurrentAppCompatActivity().getSystemService(Context.ACTIVITY_SERVICE); //返回启动它的根任务(home 或者 MainActivity) - Intent intent = new Intent(context, activity.getClass()); + Intent intent = new Intent(context, iWinBoll.getClass()); TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); stackBuilder.addNextIntentWithParentStack(intent); stackBuilder.startActivities(); //moveTaskToFront(YourTaskId, 0); LogUtils.d(TAG, "am.moveTaskToFront"); //ToastUtils.show("resumeActivity am.moveTaskToFront"); - am.moveTaskToFront(activity.getTaskId(), ActivityManager.MOVE_TASK_NO_USER_ACTION); + am.moveTaskToFront(iWinBoll.getCurrentAppCompatActivity().getTaskId(), ActivityManager.MOVE_TASK_NO_USER_ACTION); } @@ -165,19 +166,19 @@ public class WinBollActivityManager { // public void finishAll() { try { - for (String key : _mapActivityList.keySet()) { + for (String key : _mapIWinBollList.keySet()) { //System.out.println("Key: " + key + ", Value: " + _mapActivityList.get(key)); - WinBollActivity activity = _mapActivityList.get(key); + IWinBoll iWinBoll = _mapIWinBollList.get(key); //ToastUtils.show("finishAll() activity"); - if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) { + if (iWinBoll != null && !iWinBoll.getCurrentAppCompatActivity().isFinishing() && !iWinBoll.getCurrentAppCompatActivity().isDestroyed()) { //ToastUtils.show("activity != null ..."); if (WinBollGlobalApplication.getWinBollUI_TYPE() == WinBollGlobalApplication.WinBollUI_TYPE.Service) { // 结束窗口和最近任务栏, 建议前台服务类应用使用,可以方便用户再次调用 UI 操作。 - activity.finishAndRemoveTask(); + iWinBoll.getCurrentAppCompatActivity().finishAndRemoveTask(); //ToastUtils.show("finishAll() activity.finishAndRemoveTask();"); } else if (WinBollGlobalApplication.getWinBollUI_TYPE() == WinBollGlobalApplication.WinBollUI_TYPE.Aplication) { // 结束窗口保留最近任务栏,建议前台服务类应用使用,可以保持应用的系统自觉性。 - activity.finish(); + iWinBoll.getCurrentAppCompatActivity().finish(); //ToastUtils.show("finishAll() activity.finish();"); } else { LogUtils.d(TAG, "WinBollApplication.WinBollUI_TYPE error."); @@ -193,9 +194,9 @@ public class WinBollActivityManager { // // 结束指定Activity // - public void finish(T activity) { + public void finish(T iWinBoll) { try { - if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) { + if (iWinBoll != null && !iWinBoll.getCurrentAppCompatActivity().isFinishing() && !iWinBoll.getCurrentAppCompatActivity().isDestroyed()) { //根据tag 移除 MyActivity //String tag= activity.getTag(); //_mWinBollActivityList.remove(tag); @@ -210,10 +211,10 @@ public class WinBollActivityManager { // ★:0 1 2 3 [4] >> 3 // ★:[0] >> 直接关闭当前窗口 LogUtils.d(TAG, "finish no yet."); - WinBollActivity preActivity = getPreActivity(activity); - activity.finish(); - if (preActivity != null) { - resumeActivity(mContext, preActivity); + IWinBoll preIWinBoll = getPreIWinBoll(iWinBoll); + iWinBoll.getCurrentAppCompatActivity().finish(); + if (preIWinBoll != null) { + resumeActivity(mContext, preIWinBoll); } } @@ -225,21 +226,21 @@ public class WinBollActivityManager { // // 获取窗口队列中的前一个窗口 // - WinBollActivity getPreActivity(WinBollActivity activity) { + IWinBoll getPreIWinBoll(IWinBoll iWinBoll) { try { boolean bingo = false; - WinBollActivity preActivity = null; - for (Map.Entry entity : _mapActivityList.entrySet()) { - if (entity.getKey().equals(activity.getTag())) { + IWinBoll preIWinBoll = null; + for (Map.Entry entity : _mapIWinBollList.entrySet()) { + if (entity.getKey().equals(iWinBoll.getTag())) { bingo = true; LogUtils.d(TAG, "bingo"); break; } - preActivity = entity.getValue(); + preIWinBoll = entity.getValue(); } if (bingo) { - return preActivity; + return preIWinBoll; } } catch (Exception e) { LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); @@ -251,10 +252,10 @@ public class WinBollActivityManager { // // 从管理列表中移除管理项 // - public boolean registeRemove(T activity) { - WinBollActivity activityTest = _mapActivityList.get(activity.getTag()); - if (activityTest != null) { - _mapActivityList.remove(activity.getTag()); + public boolean registeRemove(T activity) { + IWinBoll iWinBollTest = _mapIWinBollList.get(activity.getTag()); + if (iWinBollTest != null) { + _mapIWinBollList.remove(activity.getTag()); return true; } return false; @@ -263,13 +264,13 @@ public class WinBollActivityManager { // // 打印管理列表项列表里的信息 // - public static void printAvtivityListInfo() { + public static void printIWinBollListInfo() { //LogUtils.d(TAG, "printAvtivityListInfo"); - if (!_mapActivityList.isEmpty()) { - StringBuilder sb = new StringBuilder("Map entries : " + Integer.toString(_mapActivityList.size())); - Iterator> iterator = _mapActivityList.entrySet().iterator(); + if (!_mapIWinBollList.isEmpty()) { + StringBuilder sb = new StringBuilder("Map entries : " + Integer.toString(_mapIWinBollList.size())); + Iterator> iterator = _mapIWinBollList.entrySet().iterator(); while (iterator.hasNext()) { - Map.Entry entry = iterator.next(); + Map.Entry entry = iterator.next(); sb.append("\nKey: " + entry.getKey() + ", \nValue: " + entry.getValue().getTag()); //ToastUtils.show("\nKey: " + entry.getKey() + ", Value: " + entry.getValue().getTag()); } diff --git a/libapputils/src/main/java/cc/winboll/studio/libapputils/app/WinBollFactory.java b/libapputils/src/main/java/cc/winboll/studio/libapputils/app/WinBollFactory.java new file mode 100644 index 0000000..4ccf86b --- /dev/null +++ b/libapputils/src/main/java/cc/winboll/studio/libapputils/app/WinBollFactory.java @@ -0,0 +1,16 @@ +package cc.winboll.studio.libapputils.app; + + +/** + * @Author ZhanGSKen@QQ.COM + * @Date 2025/02/04 10:19:34 + * @Describe WinBoll 工厂 + */ +public class WinBollFactory { + + public static final String TAG = "WinBollFactory"; + + public static IWinBollActivity buildWinBollActivity(IWinBoll iWinBoll) { + return new IWinBollActivity(iWinBoll); + } +} diff --git a/libapputils/src/main/java/cc/winboll/studio/libapputils/log/LogActivity.java b/libapputils/src/main/java/cc/winboll/studio/libapputils/log/LogActivity.java index d7b97bb..3397129 100644 --- a/libapputils/src/main/java/cc/winboll/studio/libapputils/log/LogActivity.java +++ b/libapputils/src/main/java/cc/winboll/studio/libapputils/log/LogActivity.java @@ -6,34 +6,40 @@ package cc.winboll.studio.libapputils.log; * @Describe WinBoll 应用日志窗口 */ import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import cc.winboll.studio.libapputils.R; -import cc.winboll.studio.libapputils.app.WinBollActivity; +import cc.winboll.studio.libapputils.app.IWinBoll; import cc.winboll.studio.libapputils.app.WinBollGlobalApplication; -public class LogActivity extends WinBollActivity { +public class LogActivity extends AppCompatActivity implements IWinBoll { public static final String TAG = "LogActivity"; LogView mLogView; - + + @Override + public AppCompatActivity getCurrentAppCompatActivity() { + return this; + } + @Override public String getTag() { return TAG; } @Override - protected Toolbar initToolBar() { + public Toolbar initToolBar() { return null; } @Override - protected boolean isEnableDisplayHomeAsUp() { + public boolean isEnableDisplayHomeAsUp() { return false; } @Override - protected boolean isAddWinBollToolBar() { + public boolean isAddWinBollToolBar() { return false; }