重构 WinBollActivity

This commit is contained in:
ZhanGSKen 2025-02-04 12:21:09 +08:00
parent b5b4fbd3f5
commit 2f019ae176
15 changed files with 445 additions and 612 deletions

View File

@ -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

View File

@ -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();
}
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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

View File

@ -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) {

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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();
}

View File

@ -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<ResolveInfo> 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<String> 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 <T extends AboutActivity> 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;
}
}
}
}

View File

@ -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<ResolveInfo> 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<String> 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 extends View> 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 extends FragmentManager> 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 <T extends WinBollActivity> 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 <T extends AboutActivity> 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();
}

View File

@ -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<String, WinBollActivity> _mapActivityList;
static Map<String, IWinBoll> _mapIWinBollList;
public WinBollActivityManager(Context context) {
mContext = context;
LogUtils.d(TAG, "WinBollActivityManager()");
_mapActivityList = new HashMap<String, WinBollActivity>();
_mapIWinBollList = new HashMap<String, IWinBoll>();
}
public static synchronized WinBollActivityManager getInstance(Context context) {
@ -44,12 +45,12 @@ public class WinBollActivityManager {
//
// 把Activity添加到管理中
//
public <T extends WinBollActivity> void add(T activity) {
if (isActive(activity.getTag())) {
LogUtils.d(TAG, String.format("add(...) %s is active.", activity.getTag()));
public <T extends IWinBoll> 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 <T extends WinBollActivity> void startWinBollActivity(Context context, Class<T> clazz) {
public <T extends IWinBoll> void startWinBollActivity(Context context, Class<T> clazz) {
try {
// 如果窗口已存在就重启窗口
String tag = clazz.newInstance().getTag();
@ -81,7 +82,7 @@ public class WinBollActivityManager {
}
}
public <T extends WinBollActivity> void startWinBollActivity(Context context, Intent intent, Class<T> clazz) {
public <T extends IWinBoll> void startWinBollActivity(Context context, Intent intent, Class<T> 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 <T extends WinBollActivity> void resumeActivity(Context context, String tag) {
public <T extends IWinBoll> 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 <T extends WinBollActivity> void resumeActivity(Context context, T activity) {
ActivityManager am = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
public <T extends IWinBoll> 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 <T extends WinBollActivity> void finish(T activity) {
public <T extends IWinBoll> 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<String, WinBollActivity> entity : _mapActivityList.entrySet()) {
if (entity.getKey().equals(activity.getTag())) {
IWinBoll preIWinBoll = null;
for (Map.Entry<String, IWinBoll> 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 <T extends WinBollActivity> boolean registeRemove(T activity) {
WinBollActivity activityTest = _mapActivityList.get(activity.getTag());
if (activityTest != null) {
_mapActivityList.remove(activity.getTag());
public <T extends IWinBoll> 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<Map.Entry<String, WinBollActivity>> iterator = _mapActivityList.entrySet().iterator();
if (!_mapIWinBollList.isEmpty()) {
StringBuilder sb = new StringBuilder("Map entries : " + Integer.toString(_mapIWinBollList.size()));
Iterator<Map.Entry<String, IWinBoll>> iterator = _mapIWinBollList.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, WinBollActivity> entry = iterator.next();
Map.Entry<String, IWinBoll> entry = iterator.next();
sb.append("\nKey: " + entry.getKey() + ", \nValue: " + entry.getValue().getTag());
//ToastUtils.show("\nKey: " + entry.getKey() + ", Value: " + entry.getValue().getTag());
}

View File

@ -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);
}
}

View File

@ -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;
}