Merge branch 'appbase' into aes
This commit is contained in:
		@@ -29,7 +29,7 @@ android {
 | 
			
		||||
        // versionName 更新后需要手动设置 
 | 
			
		||||
        // .winboll/winbollBuildProps.properties 文件的 stageCount=0
 | 
			
		||||
        // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
 | 
			
		||||
        versionName "2.0" 
 | 
			
		||||
        versionName "2.1"
 | 
			
		||||
        if(true) {
 | 
			
		||||
            versionName = genVersionName("${versionName}")
 | 
			
		||||
        }
 | 
			
		||||
@@ -44,9 +44,13 @@ android {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dependencies {
 | 
			
		||||
    api project(':libappbase')
 | 
			
		||||
    implementation project(':libappbase')
 | 
			
		||||
	implementation fileTree(dir: 'libs', include: ['*.jar'])
 | 
			
		||||
    
 | 
			
		||||
    // SSH
 | 
			
		||||
    implementation 'com.jcraft:jsch:0.1.55'
 | 
			
		||||
    // Html 解析
 | 
			
		||||
    implementation 'org.jsoup:jsoup:1.13.1'
 | 
			
		||||
    // 二维码类库
 | 
			
		||||
    implementation 'com.google.zxing:core:3.4.1'
 | 
			
		||||
    implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
#Created by .winboll/winboll_app_build.gradle
 | 
			
		||||
#Thu Feb 27 02:34:13 GMT 2025
 | 
			
		||||
stageCount=3
 | 
			
		||||
#Sat Mar 08 02:31:11 HKT 2025
 | 
			
		||||
stageCount=2
 | 
			
		||||
libraryProject=libappbase
 | 
			
		||||
baseVersion=2.0
 | 
			
		||||
publishVersion=2.0.2
 | 
			
		||||
buildCount=4
 | 
			
		||||
baseBetaVersion=2.0.3
 | 
			
		||||
baseVersion=2.1
 | 
			
		||||
publishVersion=2.1.1
 | 
			
		||||
buildCount=0
 | 
			
		||||
baseBetaVersion=2.1.2
 | 
			
		||||
 
 | 
			
		||||
@@ -54,19 +54,25 @@
 | 
			
		||||
        <receiver android:name="cc.winboll.studio.appbase.receivers.MainReceiver">
 | 
			
		||||
 | 
			
		||||
            <intent-filter>
 | 
			
		||||
 | 
			
		||||
                <action android:name="cc.winboll.studio.appbase.receivers.MainReceiver"/>
 | 
			
		||||
 | 
			
		||||
            </intent-filter>
 | 
			
		||||
 | 
			
		||||
        </receiver>
 | 
			
		||||
 | 
			
		||||
        <receiver
 | 
			
		||||
            android:name=".widgets.WinBollNewsWidget"
 | 
			
		||||
            android:name=".widgets.APPNewsWidget"
 | 
			
		||||
            android:exported="true">
 | 
			
		||||
 | 
			
		||||
            <intent-filter>
 | 
			
		||||
                <action android:name="cc.winboll.studio.appbase.widgets.WinBollNewsWidget.ACTION_WAKEUP_SERVICE"/>
 | 
			
		||||
                <action android:name="cc.winboll.studio.appbase.widgets.WinBollNewsWidget.ACTION_RELOAD_REPORT"/>
 | 
			
		||||
 | 
			
		||||
                <action android:name="cc.winboll.studio.appbase.widgets.APPNewsWidget.ACTION_WAKEUP_SERVICE"/>
 | 
			
		||||
 | 
			
		||||
                <action android:name="cc.winboll.studio.appbase.widgets.APPNewsWidget.ACTION_RELOAD_REPORT"/>
 | 
			
		||||
 | 
			
		||||
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
 | 
			
		||||
 | 
			
		||||
            </intent-filter>
 | 
			
		||||
 | 
			
		||||
            <meta-data
 | 
			
		||||
@@ -75,13 +81,13 @@
 | 
			
		||||
 | 
			
		||||
        </receiver>
 | 
			
		||||
 | 
			
		||||
        <receiver android:name=".widgets.WinBollNewsWidgetClickListener">
 | 
			
		||||
        <receiver android:name=".widgets.APPNewsWidgetClickListener">
 | 
			
		||||
 | 
			
		||||
            <intent-filter>
 | 
			
		||||
 | 
			
		||||
                <action android:name="cc.winboll.studio.appbase.widgets.WinBollNewsWidgetClickListener.ACTION_PRE"/>
 | 
			
		||||
                <action android:name="cc.winboll.studio.appbase.widgets.APPNewsWidgetClickListener.ACTION_PRE"/>
 | 
			
		||||
 | 
			
		||||
                <action android:name="cc.winboll.studio.appbase.widgets.WinBollNewsWidgetClickListener.ACTION_NEXT"/>
 | 
			
		||||
                <action android:name="cc.winboll.studio.appbase.widgets.APPNewsWidgetClickListener.ACTION_NEXT"/>
 | 
			
		||||
 | 
			
		||||
            </intent-filter>
 | 
			
		||||
 | 
			
		||||
@@ -91,6 +97,11 @@
 | 
			
		||||
            android:name="android.max_aspect"
 | 
			
		||||
            android:value="4.0"/>
 | 
			
		||||
 | 
			
		||||
        <service android:name="cc.winboll.studio.appbase.services.TestDemoBindService"
 | 
			
		||||
            android:exported="true"/>
 | 
			
		||||
            
 | 
			
		||||
        <service android:name="cc.winboll.studio.appbase.services.TestDemoService"
 | 
			
		||||
            android:exported="true"/>
 | 
			
		||||
 | 
			
		||||
    </application>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,22 +6,23 @@ package cc.winboll.studio.appbase;
 | 
			
		||||
 * @Describe APPbase 应用类
 | 
			
		||||
 */
 | 
			
		||||
import cc.winboll.studio.libappbase.GlobalApplication;
 | 
			
		||||
import cc.winboll.studio.libappbase.SOSCSBroadcastReceiver;
 | 
			
		||||
import android.content.IntentFilter;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.SOSCenterServiceReceiver;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.SOS;
 | 
			
		||||
 | 
			
		||||
public class App extends GlobalApplication {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "App";
 | 
			
		||||
    
 | 
			
		||||
    SOSCSBroadcastReceiver mSOSCSBroadcastReceiver;
 | 
			
		||||
    SOSCenterServiceReceiver mSOSCenterServiceReceiver;
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onCreate() {
 | 
			
		||||
        super.onCreate();
 | 
			
		||||
        GlobalApplication.setIsDebuging(this, BuildConfig.DEBUG);
 | 
			
		||||
        mSOSCSBroadcastReceiver = new SOSCSBroadcastReceiver();
 | 
			
		||||
        mSOSCenterServiceReceiver = new SOSCenterServiceReceiver();
 | 
			
		||||
        IntentFilter intentFilter = new IntentFilter();
 | 
			
		||||
        intentFilter.addAction(SOSCSBroadcastReceiver.ACTION_SOS);
 | 
			
		||||
        registerReceiver(mSOSCSBroadcastReceiver, intentFilter);
 | 
			
		||||
        intentFilter.addAction(SOS.ACTION_SOS);
 | 
			
		||||
        registerReceiver(mSOSCenterServiceReceiver, intentFilter);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
package cc.winboll.studio.appbase;
 | 
			
		||||
 | 
			
		||||
import android.content.ComponentName;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
@@ -9,15 +8,16 @@ import androidx.appcompat.app.AppCompatActivity;
 | 
			
		||||
import androidx.appcompat.widget.Toolbar;
 | 
			
		||||
import cc.winboll.studio.appbase.R;
 | 
			
		||||
import cc.winboll.studio.appbase.services.MainService;
 | 
			
		||||
import cc.winboll.studio.appbase.services.TestDemoBindService;
 | 
			
		||||
import cc.winboll.studio.appbase.services.TestDemoService;
 | 
			
		||||
import cc.winboll.studio.libappbase.GlobalApplication;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogView;
 | 
			
		||||
import cc.winboll.studio.libappbase.WinBoll;
 | 
			
		||||
import cc.winboll.studio.libappbase.SimpleOperateSignalCenterService;
 | 
			
		||||
import cc.winboll.studio.libappbase.bean.APPNewsBean;
 | 
			
		||||
import cc.winboll.studio.libappbase.services.TestService;
 | 
			
		||||
import cc.winboll.studio.libappbase.widgets.StatusWidget;
 | 
			
		||||
import com.hjq.toast.ToastUtils;
 | 
			
		||||
import android.content.ComponentName;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.SOS;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.SOSObject;
 | 
			
		||||
 | 
			
		||||
public class MainActivity extends AppCompatActivity {
 | 
			
		||||
 | 
			
		||||
@@ -68,17 +68,17 @@ public class MainActivity extends AppCompatActivity {
 | 
			
		||||
        MainService.stopMainService(this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onTestStopWithoutSettingEnable(View view) {
 | 
			
		||||
        LogUtils.d(TAG, "onTestStopWithoutSettingEnable");
 | 
			
		||||
        stopService(new Intent(this, SimpleOperateSignalCenterService.class));
 | 
			
		||||
    public void onTestStopMainServiceWithoutSettingEnable(View view) {
 | 
			
		||||
        LogUtils.d(TAG, "onTestStopMainServiceWithoutSettingEnable");
 | 
			
		||||
        stopService(new Intent(this, MainService.class));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onTestStartWithString(View view) {
 | 
			
		||||
        LogUtils.d(TAG, "onTestStartWithString");
 | 
			
		||||
    public void onTestUseComponentStartService(View view) {
 | 
			
		||||
        LogUtils.d(TAG, "onTestUseComponentStartService");
 | 
			
		||||
 | 
			
		||||
        // 目标服务的包名和类名
 | 
			
		||||
        String packageName = this.getPackageName();
 | 
			
		||||
        String serviceClassName = SimpleOperateSignalCenterService.class.getName();
 | 
			
		||||
        String serviceClassName = TestDemoService.class.getName();
 | 
			
		||||
 | 
			
		||||
        // 构建Intent
 | 
			
		||||
        Intent intentService = new Intent();
 | 
			
		||||
@@ -87,30 +87,55 @@ public class MainActivity extends AppCompatActivity {
 | 
			
		||||
        startService(intentService);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onSOS(View view) {
 | 
			
		||||
        Intent intent = new Intent(this, TestService.class);
 | 
			
		||||
    public void onTestSOS(View view) {
 | 
			
		||||
        Intent intent = new Intent(this, TestDemoService.class);
 | 
			
		||||
        stopService(intent);
 | 
			
		||||
        WinBoll.sosService(this, new APPNewsBean(getPackageName(), TestService.class.getName()));
 | 
			
		||||
        if(App.isDebuging()) {
 | 
			
		||||
            SOS.sosToAppBaseBeta(this, TestDemoService.class.getName());
 | 
			
		||||
        } else {
 | 
			
		||||
            SOS.sosToAppBase(this, TestDemoService.class.getName());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onStartTestService(View view) {
 | 
			
		||||
        Intent intent = new Intent(this, TestService.class);
 | 
			
		||||
        intent.setAction(WinBoll.ACTION_SERVICE_ENABLE);
 | 
			
		||||
    public void onSartTestDemoService(View view) {
 | 
			
		||||
        Intent intent = new Intent(this, TestDemoService.class);
 | 
			
		||||
        intent.setAction(TestDemoService.ACTION_ENABLE);
 | 
			
		||||
        startService(intent);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onStopTestService(View view) {
 | 
			
		||||
        Intent intent = new Intent(this, TestService.class);
 | 
			
		||||
        intent.setAction(WinBoll.ACTION_SERVICE_DISABLE);
 | 
			
		||||
    public void onStopTestDemoService(View view) {
 | 
			
		||||
        Intent intent = new Intent(this, TestDemoService.class);
 | 
			
		||||
        intent.setAction(TestDemoService.ACTION_DISABLE);
 | 
			
		||||
        startService(intent);
 | 
			
		||||
        
 | 
			
		||||
        Intent intentStop = new Intent(this, TestService.class);
 | 
			
		||||
        Intent intentStop = new Intent(this, TestDemoService.class);
 | 
			
		||||
        stopService(intentStop);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onStopTestServiceNoSettings(View view) {
 | 
			
		||||
        Intent intent = new Intent(this, TestService.class);
 | 
			
		||||
    public void onStopTestDemoServiceNoSettings(View view) {
 | 
			
		||||
        Intent intent = new Intent(this, TestDemoService.class);
 | 
			
		||||
        stopService(intent);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void onSartTestDemoBindService(View view) {
 | 
			
		||||
        Intent intent = new Intent(this, TestDemoBindService.class);
 | 
			
		||||
        intent.setAction(TestDemoBindService.ACTION_ENABLE);
 | 
			
		||||
        startService(intent);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onStopTestDemoBindService(View view) {
 | 
			
		||||
        Intent intent = new Intent(this, TestDemoBindService.class);
 | 
			
		||||
        intent.setAction(TestDemoBindService.ACTION_DISABLE);
 | 
			
		||||
        startService(intent);
 | 
			
		||||
 | 
			
		||||
        Intent intentStop = new Intent(this, TestDemoBindService.class);
 | 
			
		||||
        stopService(intentStop);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onStopTestDemoBindServiceNoSettings(View view) {
 | 
			
		||||
        Intent intent = new Intent(this, TestDemoBindService.class);
 | 
			
		||||
        stopService(intent);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -35,8 +35,7 @@ public class MainServiceBean extends BaseBean {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException {
 | 
			
		||||
        super.writeThisToJsonWriter(jsonWriter);
 | 
			
		||||
        MainServiceBean bean = this;
 | 
			
		||||
        jsonWriter.name("isEnable").value(bean.isEnable());
 | 
			
		||||
        jsonWriter.name("isEnable").value(isEnable());
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
package cc.winboll.studio.libappbase.bean;
 | 
			
		||||
package cc.winboll.studio.appbase.beans;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@AliYun.Com
 | 
			
		||||
 * @Date 2025/02/19 13:34:52
 | 
			
		||||
 * @Date 2025/03/07 12:47:22
 | 
			
		||||
 * @Describe TestServiceBean
 | 
			
		||||
 */
 | 
			
		||||
import android.util.JsonReader;
 | 
			
		||||
@@ -10,13 +10,13 @@ import android.util.JsonWriter;
 | 
			
		||||
import cc.winboll.studio.libappbase.BaseBean;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 | 
			
		||||
public class TestServiceBean extends BaseBean {
 | 
			
		||||
public class TestDemoBindServiceBean extends BaseBean {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "TestServiceBean";
 | 
			
		||||
 | 
			
		||||
    boolean isEnable;
 | 
			
		||||
 | 
			
		||||
    public TestServiceBean() {
 | 
			
		||||
    public TestDemoBindServiceBean() {
 | 
			
		||||
        this.isEnable = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -30,7 +30,7 @@ public class TestServiceBean extends BaseBean {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getName() {
 | 
			
		||||
        return TestServiceBean.class.getName();
 | 
			
		||||
        return TestDemoBindServiceBean.class.getName();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -0,0 +1,68 @@
 | 
			
		||||
package cc.winboll.studio.appbase.beans;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@AliYun.Com
 | 
			
		||||
 * @Date 2025/03/07 12:49:21
 | 
			
		||||
 * @Describe TestDemoServiceBean
 | 
			
		||||
 */
 | 
			
		||||
import android.util.JsonReader;
 | 
			
		||||
import android.util.JsonWriter;
 | 
			
		||||
import cc.winboll.studio.libappbase.BaseBean;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 | 
			
		||||
public class TestDemoServiceBean extends BaseBean {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "TestDemoServiceBean";
 | 
			
		||||
 | 
			
		||||
    boolean isEnable;
 | 
			
		||||
 | 
			
		||||
    public TestDemoServiceBean() {
 | 
			
		||||
        this.isEnable = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setIsEnable(boolean isEnable) {
 | 
			
		||||
        this.isEnable = isEnable;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isEnable() {
 | 
			
		||||
        return isEnable;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getName() {
 | 
			
		||||
        return TestDemoServiceBean.class.getName();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException {
 | 
			
		||||
        super.writeThisToJsonWriter(jsonWriter);
 | 
			
		||||
        jsonWriter.name("isEnable").value(isEnable());
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException {
 | 
			
		||||
        if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else {
 | 
			
		||||
            if (name.equals("isEnable")) {
 | 
			
		||||
                setIsEnable(jsonReader.nextBoolean());
 | 
			
		||||
            } else {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public BaseBean readBeanFromJsonReader(JsonReader jsonReader) throws IOException {
 | 
			
		||||
        jsonReader.beginObject();
 | 
			
		||||
        while (jsonReader.hasNext()) {
 | 
			
		||||
            String name = jsonReader.nextName();
 | 
			
		||||
            if (!initObjectsFromJsonReader(jsonReader, name)) {
 | 
			
		||||
                jsonReader.skipValue();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // 结束 JSON 对象
 | 
			
		||||
        jsonReader.endObject();
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -13,16 +13,18 @@ import android.content.Intent;
 | 
			
		||||
import android.content.IntentFilter;
 | 
			
		||||
import cc.winboll.studio.appbase.beans.WinBollNewsBean;
 | 
			
		||||
import cc.winboll.studio.appbase.services.MainService;
 | 
			
		||||
import cc.winboll.studio.appbase.widgets.WinBollNewsWidget;
 | 
			
		||||
import cc.winboll.studio.appbase.widgets.APPNewsWidget;
 | 
			
		||||
import cc.winboll.studio.libappbase.AppUtils;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.libappbase.WinBoll;
 | 
			
		||||
import cc.winboll.studio.libappbase.bean.APPNewsBean;
 | 
			
		||||
import com.hjq.toast.ToastUtils;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.lang.ref.WeakReference;
 | 
			
		||||
import java.text.SimpleDateFormat;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.WinBoll;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.APPModel;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.SOS;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.SOSObject;
 | 
			
		||||
 | 
			
		||||
public class MainReceiver extends BroadcastReceiver {
 | 
			
		||||
 | 
			
		||||
@@ -45,49 +47,39 @@ public class MainReceiver extends BroadcastReceiver {
 | 
			
		||||
            LogUtils.d(TAG, "ACTION_BIND");
 | 
			
		||||
            LogUtils.d(TAG, String.format("context.getPackageName() %s", context.getPackageName()));
 | 
			
		||||
            LogUtils.d(TAG, String.format("intent.getAction() %s", intent.getAction()));
 | 
			
		||||
            String SOS = intent.getStringExtra("SOS");
 | 
			
		||||
            LogUtils.d(TAG, String.format("SOS %s", SOS));
 | 
			
		||||
            if (SOS != null && SOS.equals("Service")) {
 | 
			
		||||
                String szAPPSOSBean = intent.getStringExtra("APPSOSBean");
 | 
			
		||||
                LogUtils.d(TAG, String.format("szAPPSOSBean %s", szAPPSOSBean));
 | 
			
		||||
                if (szAPPSOSBean != null && !szAPPSOSBean.equals("")) {
 | 
			
		||||
            String szAPPModel = intent.getStringExtra(WinBoll.EXTRA_APPMODEL);
 | 
			
		||||
            LogUtils.d(TAG, String.format("szAPPModel %s", szAPPModel));
 | 
			
		||||
            if (szAPPModel != null && !szAPPModel.equals("")) {
 | 
			
		||||
                try {
 | 
			
		||||
                        APPNewsBean bean = APPNewsBean.parseStringToBean(szAPPSOSBean, APPNewsBean.class);
 | 
			
		||||
                    APPModel bean = APPModel.parseStringToBean(szAPPModel, APPModel.class);
 | 
			
		||||
                    if (bean != null) {
 | 
			
		||||
                            String szNewsPackageName = bean.getNewsPackageName();
 | 
			
		||||
                            LogUtils.d(TAG, String.format("szNewsPackageName %s", szNewsPackageName));
 | 
			
		||||
                            String szNewsClassName = bean.getNewsClassName();
 | 
			
		||||
                            LogUtils.d(TAG, String.format("szNewsClassName %s", szNewsClassName));
 | 
			
		||||
                            mwrService.get().bindSOSConnection(bean);
 | 
			
		||||
                        String szAppPackageName = bean.getAppPackageName();
 | 
			
		||||
                        LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName));
 | 
			
		||||
                        String szAppMainServiveName = bean.getAppMainServiveName();
 | 
			
		||||
                        LogUtils.d(TAG, String.format("szAppMainServiveName %s", szAppMainServiveName));
 | 
			
		||||
                        mwrService.get().bindAPPModelConnection(bean);
 | 
			
		||||
                    }
 | 
			
		||||
                } catch (IOException e) {
 | 
			
		||||
                    LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            }
 | 
			
		||||
        } else if (intent.getAction().equals(WinBoll.ACTION_SOS)) {
 | 
			
		||||
        } else if (intent.getAction().equals(SOS.ACTION_SOS)) {
 | 
			
		||||
            LogUtils.d(TAG, "ACTION_SOS");
 | 
			
		||||
            LogUtils.d(TAG, String.format("context.getPackageName() %s", context.getPackageName()));
 | 
			
		||||
            LogUtils.d(TAG, String.format("intent.getAction() %s", intent.getAction()));
 | 
			
		||||
            String SOS = intent.getStringExtra("SOS");
 | 
			
		||||
            LogUtils.d(TAG, String.format("SOS %s", SOS));
 | 
			
		||||
            if (SOS != null && SOS.equals("Service")) {
 | 
			
		||||
                String szAPPNewsBean = intent.getStringExtra("APPSOSBean");
 | 
			
		||||
                LogUtils.d(TAG, String.format("szAPPNewsBean %s", szAPPNewsBean));
 | 
			
		||||
                if (szAPPNewsBean != null && !szAPPNewsBean.equals("")) {
 | 
			
		||||
                    try {
 | 
			
		||||
                        APPNewsBean bean = APPNewsBean.parseStringToBean(szAPPNewsBean, APPNewsBean.class);
 | 
			
		||||
            String sos = intent.getStringExtra(SOS.EXTRA_OBJECT);
 | 
			
		||||
            LogUtils.d(TAG, String.format("SOS %s", sos));
 | 
			
		||||
            if (sos != null && !sos.equals("")) {
 | 
			
		||||
                SOSObject bean = SOS.parseSOSObject(sos);
 | 
			
		||||
                if (bean != null) {
 | 
			
		||||
                            String szNewsPackageName = bean.getNewsPackageName();
 | 
			
		||||
                            LogUtils.d(TAG, String.format("szNewsPackageName %s", szNewsPackageName));
 | 
			
		||||
                            String szNewsClassName = bean.getNewsClassName();
 | 
			
		||||
                            LogUtils.d(TAG, String.format("szNewsClassName %s", szNewsClassName));
 | 
			
		||||
                    String szObjectPackageName = bean.getObjectPackageName();
 | 
			
		||||
                    LogUtils.d(TAG, String.format("szObjectPackageName %s", szObjectPackageName));
 | 
			
		||||
                    String szObjectServiveName = bean.getObjectServiveName();
 | 
			
		||||
                    LogUtils.d(TAG, String.format("szObjectServiveName %s", szObjectServiveName));
 | 
			
		||||
 | 
			
		||||
                    Intent intentService = new Intent();
 | 
			
		||||
                            intentService.setComponent(new ComponentName(szNewsPackageName, szNewsClassName));
 | 
			
		||||
                    intentService.setComponent(new ComponentName(szObjectPackageName, szObjectServiveName));
 | 
			
		||||
                    context.startService(intentService);
 | 
			
		||||
 | 
			
		||||
                            String appName = AppUtils.getAppNameByPackageName(context, szNewsPackageName);
 | 
			
		||||
                    String appName = AppUtils.getAppNameByPackageName(context, szObjectPackageName);
 | 
			
		||||
                    LogUtils.d(TAG, String.format("appName %s", appName));
 | 
			
		||||
                    WinBollNewsBean appWinBollNewsBean = new WinBollNewsBean(appName);
 | 
			
		||||
                    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
 | 
			
		||||
@@ -99,16 +91,14 @@ public class MainReceiver extends BroadcastReceiver {
 | 
			
		||||
                    sbLine.append(appName);
 | 
			
		||||
                    appWinBollNewsBean.setMessage(sbLine.toString());
 | 
			
		||||
 | 
			
		||||
                            WinBollNewsWidget.addWinBollNewsBean(context, appWinBollNewsBean);
 | 
			
		||||
                    APPNewsWidget.addWinBollNewsBean(context, appWinBollNewsBean);
 | 
			
		||||
 | 
			
		||||
                            Intent intentWidget = new Intent(context, WinBollNewsWidget.class);
 | 
			
		||||
                            intentWidget.setAction(WinBollNewsWidget.ACTION_RELOAD_REPORT);
 | 
			
		||||
                    Intent intentWidget = new Intent(context, APPNewsWidget.class);
 | 
			
		||||
                    intentWidget.setAction(APPNewsWidget.ACTION_RELOAD_REPORT);
 | 
			
		||||
                    context.sendBroadcast(intentWidget);
 | 
			
		||||
                }
 | 
			
		||||
                    } catch (IOException e) {
 | 
			
		||||
                        LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            ToastUtils.show(szAction);
 | 
			
		||||
@@ -120,10 +110,8 @@ public class MainReceiver extends BroadcastReceiver {
 | 
			
		||||
    public void registerAction(MainService service) {
 | 
			
		||||
        IntentFilter filter=new IntentFilter();
 | 
			
		||||
        filter.addAction(ACTION_BOOT_COMPLETED);
 | 
			
		||||
        filter.addAction(WinBoll.ACTION_SOS);
 | 
			
		||||
        filter.addAction(SOS.ACTION_SOS);
 | 
			
		||||
        filter.addAction(WinBoll.ACTION_BIND);
 | 
			
		||||
        filter.addAction(WinBoll.ACTION_SERVICE_ENABLE);
 | 
			
		||||
        filter.addAction(WinBoll.ACTION_SERVICE_DISABLE);
 | 
			
		||||
        //filter.addAction(Intent.ACTION_BATTERY_CHANGED);
 | 
			
		||||
        service.registerReceiver(this, filter);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -23,10 +23,10 @@ import cc.winboll.studio.appbase.handlers.MainServiceHandler;
 | 
			
		||||
import cc.winboll.studio.appbase.receivers.MainReceiver;
 | 
			
		||||
import cc.winboll.studio.appbase.services.AssistantService;
 | 
			
		||||
import cc.winboll.studio.appbase.threads.MainServiceThread;
 | 
			
		||||
import cc.winboll.studio.appbase.widgets.WinBollNewsWidget;
 | 
			
		||||
import cc.winboll.studio.appbase.widgets.APPNewsWidget;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.libappbase.bean.APPNewsBean;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.APPModel;
 | 
			
		||||
 | 
			
		||||
public class MainService extends Service {
 | 
			
		||||
 | 
			
		||||
@@ -45,7 +45,7 @@ public class MainService extends Service {
 | 
			
		||||
    AssistantService mAssistantService;
 | 
			
		||||
    boolean isBound = false;
 | 
			
		||||
    MainReceiver mMainReceiver;
 | 
			
		||||
    ArrayList<SOSConnection> mSOSConnectionList;
 | 
			
		||||
    ArrayList<APPConnection> mAPPModelConnectionList;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public IBinder onBind(Intent intent) {
 | 
			
		||||
@@ -60,7 +60,7 @@ public class MainService extends Service {
 | 
			
		||||
    public void onCreate() {
 | 
			
		||||
        super.onCreate();
 | 
			
		||||
        LogUtils.d(TAG, "onCreate()");
 | 
			
		||||
        mSOSConnectionList = new ArrayList<SOSConnection>();
 | 
			
		||||
        mAPPModelConnectionList = new ArrayList<APPConnection>();
 | 
			
		||||
 | 
			
		||||
        _mControlCenterService = MainService.this;
 | 
			
		||||
        isServiceRunning = false;
 | 
			
		||||
@@ -101,8 +101,8 @@ public class MainService extends Service {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // 启动小部件
 | 
			
		||||
            Intent intentTimeWidget = new Intent(this, WinBollNewsWidget.class);
 | 
			
		||||
            intentTimeWidget.setAction(WinBollNewsWidget.ACTION_RELOAD_REPORT);
 | 
			
		||||
            Intent intentTimeWidget = new Intent(this, APPNewsWidget.class);
 | 
			
		||||
            intentTimeWidget.setAction(APPNewsWidget.ACTION_RELOAD_REPORT);
 | 
			
		||||
            this.sendBroadcast(intentTimeWidget);
 | 
			
		||||
 | 
			
		||||
            startMainServiceThread();
 | 
			
		||||
@@ -117,21 +117,11 @@ public class MainService extends Service {
 | 
			
		||||
    //
 | 
			
		||||
    void wakeupAndBindAssistant() {
 | 
			
		||||
        LogUtils.d(TAG, "wakeupAndBindAssistant()");
 | 
			
		||||
//        if (ServiceUtils.isServiceAlive(getApplicationContext(), AssistantService.class.getName()) == false) {
 | 
			
		||||
//            startService(new Intent(MainService.this, AssistantService.class));
 | 
			
		||||
//            //LogUtils.d(TAG, "call wakeupAndBindAssistant() : Binding... AssistantService");
 | 
			
		||||
//            bindService(new Intent(MainService.this, AssistantService.class), mMyServiceConnection, Context.BIND_IMPORTANT);
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        Intent intent = new Intent(this, AssistantService.class);
 | 
			
		||||
        startService(intent);
 | 
			
		||||
        // 绑定服务的Intent
 | 
			
		||||
        //Intent intent = new Intent(this, AssistantService.class);
 | 
			
		||||
        bindService(intent, mMyServiceConnection, Context.BIND_IMPORTANT);
 | 
			
		||||
 | 
			
		||||
//        Intent intent = new Intent(this, AssistantService.class);
 | 
			
		||||
//        startService(intent);
 | 
			
		||||
//        LogUtils.d(TAG, "startService(intent)");
 | 
			
		||||
//        bindService(new Intent(this, AssistantService.class), mMyServiceConnection, Context.BIND_IMPORTANT);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 开启提醒铃声线程
 | 
			
		||||
@@ -192,40 +182,40 @@ public class MainService extends Service {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void bindSOSConnection(APPNewsBean bean) {
 | 
			
		||||
        LogUtils.d(TAG, "bindSOSConnection(...)");
 | 
			
		||||
    public void bindAPPModelConnection(APPModel bean) {
 | 
			
		||||
        LogUtils.d(TAG, "bindAPPModelConnection(...)");
 | 
			
		||||
        // 清理旧的绑定链接
 | 
			
		||||
        for (int i = mSOSConnectionList.size() - 1; i > -1; i--) {
 | 
			
		||||
            SOSConnection item = mSOSConnectionList.get(i);
 | 
			
		||||
            if (item.isBindToAPPSOSBean(bean)) {
 | 
			
		||||
        for (int i = mAPPModelConnectionList.size() - 1; i > -1; i--) {
 | 
			
		||||
            APPConnection item = mAPPModelConnectionList.get(i);
 | 
			
		||||
            if (item.isBindToAPP(bean)) {
 | 
			
		||||
                LogUtils.d(TAG, "Bind Servive exist.");
 | 
			
		||||
                unbindService(item);
 | 
			
		||||
                mSOSConnectionList.remove(i);
 | 
			
		||||
                mAPPModelConnectionList.remove(i);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 绑定服务
 | 
			
		||||
        SOSConnection sosConnection = new SOSConnection();
 | 
			
		||||
        APPConnection appConnection = new APPConnection();
 | 
			
		||||
        Intent intentService = new Intent();
 | 
			
		||||
        intentService.setComponent(new ComponentName(bean.getNewsPackageName(), bean.getNewsClassName()));
 | 
			
		||||
        bindService(intentService, sosConnection, Context.BIND_IMPORTANT);
 | 
			
		||||
        mSOSConnectionList.add(sosConnection);
 | 
			
		||||
        intentService.setComponent(new ComponentName(bean.getAppPackageName(), bean.getAppMainServiveName()));
 | 
			
		||||
        bindService(intentService, appConnection, Context.BIND_IMPORTANT);
 | 
			
		||||
        mAPPModelConnectionList.add(appConnection);
 | 
			
		||||
        
 | 
			
		||||
        Intent intentWidget = new Intent(this, WinBollNewsWidget.class);
 | 
			
		||||
        intentWidget.setAction(WinBollNewsWidget.ACTION_WAKEUP_SERVICE);
 | 
			
		||||
        APPNewsBean appSOSBean = new APPNewsBean(bean.getNewsPackageName(), bean.getNewsClassName());
 | 
			
		||||
        Intent intentWidget = new Intent(this, APPNewsWidget.class);
 | 
			
		||||
        intentWidget.setAction(APPNewsWidget.ACTION_WAKEUP_SERVICE);
 | 
			
		||||
        APPModel appSOSBean = new APPModel(bean.getAppPackageName(), bean.getAppMainServiveName());
 | 
			
		||||
        intentWidget.putExtra("APPSOSBean", appSOSBean.toString());
 | 
			
		||||
        sendBroadcast(intentWidget);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class SOSConnection implements ServiceConnection {
 | 
			
		||||
    public class APPConnection implements ServiceConnection {
 | 
			
		||||
 | 
			
		||||
        ComponentName mComponentName;
 | 
			
		||||
 | 
			
		||||
        boolean isBindToAPPSOSBean(APPNewsBean bean) {
 | 
			
		||||
        boolean isBindToAPP(APPModel bean) {
 | 
			
		||||
            return mComponentName != null
 | 
			
		||||
                && mComponentName.getClassName().equals(bean.getNewsClassName())
 | 
			
		||||
                && mComponentName.getPackageName().equals(bean.getNewsPackageName());
 | 
			
		||||
                && mComponentName.getClassName().equals(bean.getAppMainServiveName())
 | 
			
		||||
                && mComponentName.getPackageName().equals(bean.getAppPackageName());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
@@ -241,13 +231,13 @@ public class MainService extends Service {
 | 
			
		||||
            LogUtils.d(TAG, String.format("onServiceDisconnected : \ngetClassName %s\ngetPackageName %s", name.getClassName(), name.getPackageName()));
 | 
			
		||||
 | 
			
		||||
            // 尝试无参数启动一下服务
 | 
			
		||||
            String sosPackage = mComponentName.getPackageName();
 | 
			
		||||
            LogUtils.d(TAG, String.format("sosPackage %s", sosPackage));
 | 
			
		||||
            String sosClassName = mComponentName.getClassName();
 | 
			
		||||
            LogUtils.d(TAG, String.format("sosClassName %s", sosClassName));
 | 
			
		||||
            String appPackage = mComponentName.getPackageName();
 | 
			
		||||
            LogUtils.d(TAG, String.format("appPackage %s", appPackage));
 | 
			
		||||
            String appMainServiceClassName = mComponentName.getClassName();
 | 
			
		||||
            LogUtils.d(TAG, String.format("appMainServiceClassName %s", appMainServiceClassName));
 | 
			
		||||
 | 
			
		||||
            Intent intentService = new Intent();
 | 
			
		||||
            intentService.setComponent(new ComponentName(sosPackage, sosClassName));
 | 
			
		||||
            intentService.setComponent(new ComponentName(appPackage, appMainServiceClassName));
 | 
			
		||||
            startService(intentService);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,178 @@
 | 
			
		||||
package cc.winboll.studio.appbase.services;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@AliYun.Com
 | 
			
		||||
 * @Date 2025/03/07 12:45:49
 | 
			
		||||
 * @Describe 启动时申请绑定到APPBase主服务的服务示例
 | 
			
		||||
 */
 | 
			
		||||
import android.app.Service;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.os.Binder;
 | 
			
		||||
import android.os.IBinder;
 | 
			
		||||
import cc.winboll.studio.appbase.beans.TestDemoBindServiceBean;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.WinBoll;
 | 
			
		||||
import cc.winboll.studio.appbase.App;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.SOS;
 | 
			
		||||
 | 
			
		||||
public class TestDemoBindService extends Service {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "TestDemoBindService";
 | 
			
		||||
 | 
			
		||||
    public static final String ACTION_ENABLE = TestDemoBindService.class.getName() + ".ACTION_ENABLE";
 | 
			
		||||
    public static final String ACTION_DISABLE = TestDemoBindService.class.getName() + ".ACTION_DISABLE";
 | 
			
		||||
 | 
			
		||||
    volatile static TestThread _TestThread;
 | 
			
		||||
 | 
			
		||||
    volatile static boolean _IsRunning;
 | 
			
		||||
 | 
			
		||||
    public synchronized static void setIsRunning(boolean isRunning) {
 | 
			
		||||
        _IsRunning = isRunning;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean isRunning() {
 | 
			
		||||
        return _IsRunning;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public IBinder onBind(Intent intent) {
 | 
			
		||||
        return new MyBinder();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class MyBinder extends Binder {
 | 
			
		||||
        public TestDemoBindService getService() {
 | 
			
		||||
            return TestDemoBindService.this;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onCreate() {
 | 
			
		||||
        super.onCreate();
 | 
			
		||||
        LogUtils.d(TAG, "onCreate()");
 | 
			
		||||
 | 
			
		||||
        run();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int onStartCommand(Intent intent, int flags, int startId) {
 | 
			
		||||
        LogUtils.d(TAG, "onStartCommand(...)");
 | 
			
		||||
        TestDemoBindServiceBean bean = TestDemoBindServiceBean.loadBean(this, TestDemoBindServiceBean.class);
 | 
			
		||||
        if (bean == null) {
 | 
			
		||||
            bean = new TestDemoBindServiceBean();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (intent.getAction() != null) {
 | 
			
		||||
            if (intent.getAction().equals(ACTION_ENABLE)) {
 | 
			
		||||
                bean.setIsEnable(true);
 | 
			
		||||
                LogUtils.d(TAG, "setIsEnable(true);");
 | 
			
		||||
                TestDemoBindServiceBean.saveBean(this, bean);
 | 
			
		||||
            } else if (intent.getAction().equals(ACTION_DISABLE)) {
 | 
			
		||||
                bean.setIsEnable(false);
 | 
			
		||||
                LogUtils.d(TAG, "setIsEnable(false);");
 | 
			
		||||
                TestDemoBindServiceBean.saveBean(this, bean);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        run();
 | 
			
		||||
 | 
			
		||||
        return (bean.isEnable()) ? START_STICKY : super.onStartCommand(intent, flags, startId);
 | 
			
		||||
        //return super.onStartCommand(intent, flags, startId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void run() {
 | 
			
		||||
        LogUtils.d(TAG, "run()");
 | 
			
		||||
        TestDemoBindServiceBean bean = TestDemoBindServiceBean.loadBean(this, TestDemoBindServiceBean.class);
 | 
			
		||||
        if (bean == null) {
 | 
			
		||||
            bean = new TestDemoBindServiceBean();
 | 
			
		||||
            TestDemoBindServiceBean.saveBean(this, bean);
 | 
			
		||||
        }
 | 
			
		||||
        if (bean.isEnable()) {
 | 
			
		||||
            LogUtils.d(TAG, "run() bean.isEnable()");
 | 
			
		||||
            TestThread.getInstance(this).start();
 | 
			
		||||
            LogUtils.d(TAG, "_TestThread.start()");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onDestroy() {
 | 
			
		||||
        super.onDestroy();
 | 
			
		||||
        LogUtils.d(TAG, "onDestroy()");
 | 
			
		||||
        TestDemoBindServiceBean bean = TestDemoBindServiceBean.loadBean(this, TestDemoBindServiceBean.class);
 | 
			
		||||
        if (bean == null) {
 | 
			
		||||
            bean = new TestDemoBindServiceBean();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TestThread.getInstance(this).setIsExit(true);
 | 
			
		||||
        
 | 
			
		||||
        // 预防 APPBase 应用重启绑定失效。
 | 
			
		||||
        // 所以退出时检查本服务是否配置启用,如果启用就发送一个 SOS 信号。
 | 
			
		||||
        // 这样 APPBase 就会用组件方式启动本服务。
 | 
			
		||||
        if (bean.isEnable()) {
 | 
			
		||||
            if (App.isDebuging()) {
 | 
			
		||||
                SOS.sosToAppBaseBeta(this, TestDemoBindService.class.getName());
 | 
			
		||||
            } else {
 | 
			
		||||
                SOS.sosToAppBase(this, TestDemoBindService.class.getName());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        _IsRunning = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static class TestThread extends Thread {
 | 
			
		||||
 | 
			
		||||
        volatile static TestThread _TestThread;
 | 
			
		||||
        Context mContext;
 | 
			
		||||
        volatile boolean isStarted = false;
 | 
			
		||||
        volatile boolean isExit = false;
 | 
			
		||||
 | 
			
		||||
        TestThread(Context context) {
 | 
			
		||||
            super();
 | 
			
		||||
            mContext = context;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static synchronized TestThread getInstance(Context context) {
 | 
			
		||||
            if (_TestThread != null) {
 | 
			
		||||
                _TestThread.setIsExit(true);
 | 
			
		||||
            }
 | 
			
		||||
            _TestThread = new TestThread(context);
 | 
			
		||||
 | 
			
		||||
            return _TestThread;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public synchronized void setIsExit(boolean isExit) {
 | 
			
		||||
            this.isExit = isExit;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public boolean isExit() {
 | 
			
		||||
            return isExit;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void run() {
 | 
			
		||||
            if (isStarted == false) {
 | 
			
		||||
                isStarted = true;
 | 
			
		||||
                super.run();
 | 
			
		||||
                LogUtils.d(TAG, "run() start");
 | 
			
		||||
                if (App.isDebuging()) {
 | 
			
		||||
                    WinBoll.bindToAPPBaseBeta(mContext, TestDemoBindService.class.getName());
 | 
			
		||||
                } else {
 | 
			
		||||
                    WinBoll.bindToAPPBase(mContext, TestDemoBindService.class.getName());
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                while (!isExit()) {
 | 
			
		||||
                    LogUtils.d(TAG, "run()");
 | 
			
		||||
 | 
			
		||||
                    try {
 | 
			
		||||
                        Thread.sleep(1000);
 | 
			
		||||
                    } catch (InterruptedException e) {
 | 
			
		||||
                        LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                LogUtils.d(TAG, "run() exit");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,22 +1,25 @@
 | 
			
		||||
package cc.winboll.studio.libappbase.services;
 | 
			
		||||
package cc.winboll.studio.appbase.services;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@AliYun.Com
 | 
			
		||||
 * @Date 2025/02/15 20:48:36
 | 
			
		||||
 * @Describe TestService
 | 
			
		||||
 * @Date 2025/03/07 12:39:24
 | 
			
		||||
 * @Describe 普通服务示例
 | 
			
		||||
 */
 | 
			
		||||
import android.app.Service;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.os.Binder;
 | 
			
		||||
import android.os.IBinder;
 | 
			
		||||
import cc.winboll.studio.appbase.beans.TestDemoServiceBean;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.libappbase.bean.TestServiceBean;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.WinBoll;
 | 
			
		||||
 | 
			
		||||
public class TestService extends Service {
 | 
			
		||||
public class TestDemoService extends Service {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "TestService";
 | 
			
		||||
    public static final String TAG = "TestDemoService";
 | 
			
		||||
 | 
			
		||||
    public static final String ACTION_ENABLE = TestDemoService.class.getName() + ".ACTION_ENABLE";
 | 
			
		||||
    public static final String ACTION_DISABLE = TestDemoService.class.getName() + ".ACTION_DISABLE";
 | 
			
		||||
 | 
			
		||||
    volatile static TestThread _TestThread;
 | 
			
		||||
 | 
			
		||||
@@ -36,8 +39,8 @@ public class TestService extends Service {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class MyBinder extends Binder {
 | 
			
		||||
        public TestService getService() {
 | 
			
		||||
            return TestService.this;
 | 
			
		||||
        public TestDemoService getService() {
 | 
			
		||||
            return TestDemoService.this;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -53,29 +56,35 @@ public class TestService extends Service {
 | 
			
		||||
    @Override
 | 
			
		||||
    public int onStartCommand(Intent intent, int flags, int startId) {
 | 
			
		||||
        LogUtils.d(TAG, "onStartCommand(...)");
 | 
			
		||||
        TestServiceBean bean = TestServiceBean.loadBean(this, TestServiceBean.class);
 | 
			
		||||
        TestDemoServiceBean bean = TestDemoServiceBean.loadBean(this, TestDemoServiceBean.class);
 | 
			
		||||
        if (bean == null) {
 | 
			
		||||
            bean = new TestServiceBean();
 | 
			
		||||
            bean = new TestDemoServiceBean();
 | 
			
		||||
        }
 | 
			
		||||
//        if (intent.getAction() != null && intent.getAction().equals(WinBoll.ACTION_SERVICE_ENABLE)) {
 | 
			
		||||
//            bean.setIsEnable(true);
 | 
			
		||||
//            TestServiceBean.saveBean(this, bean);
 | 
			
		||||
//            run();
 | 
			
		||||
//        } else if (intent.getAction() != null && intent.getAction().equals(WinBoll.ACTION_SERVICE_DISABLE)) {
 | 
			
		||||
//            bean.setIsEnable(false);
 | 
			
		||||
//            TestServiceBean.saveBean(this, bean);
 | 
			
		||||
//        }
 | 
			
		||||
        LogUtils.d(TAG, String.format("TestServiceBean.saveBean setIsEnable %s", bean.isEnable()));
 | 
			
		||||
 | 
			
		||||
        if (intent.getAction() != null) {
 | 
			
		||||
            if (intent.getAction().equals(ACTION_ENABLE)) {
 | 
			
		||||
                bean.setIsEnable(true);
 | 
			
		||||
                LogUtils.d(TAG, "setIsEnable(true);");
 | 
			
		||||
                TestDemoServiceBean.saveBean(this, bean);
 | 
			
		||||
            } else if (intent.getAction().equals(ACTION_DISABLE)) {
 | 
			
		||||
                bean.setIsEnable(false);
 | 
			
		||||
                LogUtils.d(TAG, "setIsEnable(false);");
 | 
			
		||||
                TestDemoServiceBean.saveBean(this, bean);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        run();
 | 
			
		||||
 | 
			
		||||
        return (bean.isEnable()) ? START_STICKY : super.onStartCommand(intent, flags, startId);
 | 
			
		||||
        //return super.onStartCommand(intent, flags, startId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void run() {
 | 
			
		||||
        LogUtils.d(TAG, "run()");
 | 
			
		||||
        TestServiceBean bean = TestServiceBean.loadBean(this, TestServiceBean.class);
 | 
			
		||||
        TestDemoServiceBean bean = TestDemoServiceBean.loadBean(this, TestDemoServiceBean.class);
 | 
			
		||||
        if (bean == null) {
 | 
			
		||||
            bean = new TestServiceBean();
 | 
			
		||||
            TestServiceBean.saveBean(this, bean);
 | 
			
		||||
            bean = new TestDemoServiceBean();
 | 
			
		||||
            TestDemoServiceBean.saveBean(this, bean);
 | 
			
		||||
        }
 | 
			
		||||
        if (bean.isEnable()) {
 | 
			
		||||
            LogUtils.d(TAG, "run() bean.isEnable()");
 | 
			
		||||
@@ -129,7 +138,6 @@ public class TestService extends Service {
 | 
			
		||||
                isStarted = true;
 | 
			
		||||
                super.run();
 | 
			
		||||
                LogUtils.d(TAG, "run() start");
 | 
			
		||||
                WinBoll.bindToAPPBase(mContext, new APPNewsBean(mContext.getPackageName(), TestService.class.getName()));
 | 
			
		||||
 | 
			
		||||
                while (!isExit()) {
 | 
			
		||||
                    LogUtils.d(TAG, "run()");
 | 
			
		||||
@@ -15,18 +15,19 @@ import cc.winboll.studio.appbase.R;
 | 
			
		||||
import cc.winboll.studio.appbase.beans.WinBollNewsBean;
 | 
			
		||||
import cc.winboll.studio.libappbase.AppUtils;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.libappbase.bean.APPNewsBean;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.text.SimpleDateFormat;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.APPModel;
 | 
			
		||||
import cc.winboll.studio.libappbase.sos.WinBoll;
 | 
			
		||||
 | 
			
		||||
public class WinBollNewsWidget extends AppWidgetProvider {
 | 
			
		||||
public class APPNewsWidget extends AppWidgetProvider {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "WinBollNewsWidget";
 | 
			
		||||
    public static final String TAG = "APPNewsWidget";
 | 
			
		||||
    
 | 
			
		||||
    public static final String ACTION_WAKEUP_SERVICE = "cc.winboll.studio.appbase.widgets.WinBollNewsWidget.ACTION_WAKEUP_SERVICE";
 | 
			
		||||
    public static final String ACTION_RELOAD_REPORT = "cc.winboll.studio.appbase.widgets.WinBollNewsWidget.ACTION_RELOAD_REPORT";
 | 
			
		||||
    public static final String ACTION_WAKEUP_SERVICE = APPNewsWidget.class.getName() + ".ACTION_WAKEUP_SERVICE";
 | 
			
		||||
    public static final String ACTION_RELOAD_REPORT = APPNewsWidget.class.getName() + ".ACTION_RELOAD_REPORT";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    volatile static ArrayList<WinBollNewsBean> _WinBollNewsBeanList;
 | 
			
		||||
@@ -49,25 +50,25 @@ public class WinBollNewsWidget extends AppWidgetProvider {
 | 
			
		||||
        if (intent.getAction().equals(ACTION_RELOAD_REPORT)) {
 | 
			
		||||
            LogUtils.d(TAG, "ACTION_RELOAD_REPORT");
 | 
			
		||||
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
 | 
			
		||||
            int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, WinBollNewsWidget.class));
 | 
			
		||||
            int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, APPNewsWidget.class));
 | 
			
		||||
            for (int appWidgetId : appWidgetIds) {
 | 
			
		||||
                updateAppWidget(context, appWidgetManager, appWidgetId);
 | 
			
		||||
            }
 | 
			
		||||
        }else if (intent.getAction().equals(ACTION_WAKEUP_SERVICE)) {
 | 
			
		||||
            LogUtils.d(TAG, "ACTION_WAKEUP_SERVICE");
 | 
			
		||||
            String szWinBollNewsBean = intent.getStringExtra("WinBollNewsBean");
 | 
			
		||||
            LogUtils.d(TAG, String.format("szWinBollNewsBean %s", szWinBollNewsBean));
 | 
			
		||||
            if (szWinBollNewsBean != null && !szWinBollNewsBean.equals("")) {
 | 
			
		||||
            String szAPPModel = intent.getStringExtra(WinBoll.EXTRA_APPMODEL);
 | 
			
		||||
            LogUtils.d(TAG, String.format("szAPPModel %s", szAPPModel));
 | 
			
		||||
            if (szAPPModel != null && !szAPPModel.equals("")) {
 | 
			
		||||
                try {
 | 
			
		||||
                    APPNewsBean bean = APPNewsBean.parseStringToBean(szWinBollNewsBean, APPNewsBean.class);
 | 
			
		||||
                    APPModel bean = APPModel.parseStringToBean(szAPPModel, APPModel.class);
 | 
			
		||||
                    if (bean != null) {
 | 
			
		||||
                        String szNewsPackageName = bean.getNewsPackageName();
 | 
			
		||||
                        LogUtils.d(TAG, String.format("szNewsPackageName %s", szNewsPackageName));
 | 
			
		||||
                        String szNewsClassName = bean.getNewsClassName();
 | 
			
		||||
                        LogUtils.d(TAG, String.format("szNewsClassName %s", szNewsClassName));
 | 
			
		||||
                        String szAppPackageName = bean.getAppPackageName();
 | 
			
		||||
                        LogUtils.d(TAG, String.format("szAppPackageName %s", szAppPackageName));
 | 
			
		||||
                        String szAppMainServiveName = bean.getAppMainServiveName();
 | 
			
		||||
                        LogUtils.d(TAG, String.format("szAppMainServiveName %s", szAppMainServiveName));
 | 
			
		||||
 | 
			
		||||
                        
 | 
			
		||||
                        String appName = AppUtils.getAppNameByPackageName(context, szNewsPackageName);
 | 
			
		||||
                        String appName = AppUtils.getAppNameByPackageName(context, szAppPackageName);
 | 
			
		||||
                        LogUtils.d(TAG, String.format("appName %s", appName));
 | 
			
		||||
                        WinBollNewsBean winBollNewsBean = new WinBollNewsBean(appName);
 | 
			
		||||
                        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
 | 
			
		||||
@@ -82,7 +83,7 @@ public class WinBollNewsWidget extends AppWidgetProvider {
 | 
			
		||||
                        addWinBollNewsBean(context, winBollNewsBean);
 | 
			
		||||
 | 
			
		||||
                        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
 | 
			
		||||
                        int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, WinBollNewsWidget.class));
 | 
			
		||||
                        int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, APPNewsWidget.class));
 | 
			
		||||
                        for (int appWidgetId : appWidgetIds) {
 | 
			
		||||
                            updateAppWidget(context, appWidgetManager, appWidgetId);
 | 
			
		||||
                        }
 | 
			
		||||
@@ -123,12 +124,12 @@ public class WinBollNewsWidget extends AppWidgetProvider {
 | 
			
		||||
 | 
			
		||||
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_news);
 | 
			
		||||
        //设置按钮点击事件
 | 
			
		||||
        Intent intentPre = new Intent(context, WinBollNewsWidgetClickListener.class);
 | 
			
		||||
        intentPre.setAction(WinBollNewsWidgetClickListener.ACTION_PRE);
 | 
			
		||||
        Intent intentPre = new Intent(context, APPNewsWidgetClickListener.class);
 | 
			
		||||
        intentPre.setAction(APPNewsWidgetClickListener.ACTION_PRE);
 | 
			
		||||
        PendingIntent pendingIntentPre = PendingIntent.getBroadcast(context, 0, intentPre, PendingIntent.FLAG_UPDATE_CURRENT);
 | 
			
		||||
        views.setOnClickPendingIntent(R.id.widget_button_pre, pendingIntentPre);
 | 
			
		||||
        Intent intentNext = new Intent(context, WinBollNewsWidgetClickListener.class);
 | 
			
		||||
        intentNext.setAction(WinBollNewsWidgetClickListener.ACTION_NEXT);
 | 
			
		||||
        Intent intentNext = new Intent(context, APPNewsWidgetClickListener.class);
 | 
			
		||||
        intentNext.setAction(APPNewsWidgetClickListener.ACTION_NEXT);
 | 
			
		||||
        PendingIntent pendingIntentNext = PendingIntent.getBroadcast(context, 0, intentNext, PendingIntent.FLAG_UPDATE_CURRENT);
 | 
			
		||||
        views.setOnClickPendingIntent(R.id.widget_button_next, pendingIntentNext);
 | 
			
		||||
 | 
			
		||||
@@ -156,8 +157,8 @@ public class WinBollNewsWidget extends AppWidgetProvider {
 | 
			
		||||
            if (_CurrentPageIndex > 0) {
 | 
			
		||||
                _CurrentPageIndex = _CurrentPageIndex - 1;
 | 
			
		||||
            }
 | 
			
		||||
            Intent intentWidget = new Intent(context, WinBollNewsWidget.class);
 | 
			
		||||
            intentWidget.setAction(WinBollNewsWidget.ACTION_RELOAD_REPORT);
 | 
			
		||||
            Intent intentWidget = new Intent(context, APPNewsWidget.class);
 | 
			
		||||
            intentWidget.setAction(APPNewsWidget.ACTION_RELOAD_REPORT);
 | 
			
		||||
            context.sendBroadcast(intentWidget);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -167,8 +168,8 @@ public class WinBollNewsWidget extends AppWidgetProvider {
 | 
			
		||||
            if ((_CurrentPageIndex + 1) * _OnePageLinesCount < _WinBollNewsBeanList.size()) {
 | 
			
		||||
                _CurrentPageIndex = _CurrentPageIndex + 1;
 | 
			
		||||
            }
 | 
			
		||||
            Intent intentWidget = new Intent(context, WinBollNewsWidget.class);
 | 
			
		||||
            intentWidget.setAction(WinBollNewsWidget.ACTION_RELOAD_REPORT);
 | 
			
		||||
            Intent intentWidget = new Intent(context, APPNewsWidget.class);
 | 
			
		||||
            intentWidget.setAction(APPNewsWidget.ACTION_RELOAD_REPORT);
 | 
			
		||||
            context.sendBroadcast(intentWidget);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -10,11 +10,11 @@ import android.content.Context;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
 | 
			
		||||
public class WinBollNewsWidgetClickListener extends BroadcastReceiver {
 | 
			
		||||
public class APPNewsWidgetClickListener extends BroadcastReceiver {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "WinBollNewsWidgetClickListener";
 | 
			
		||||
    public static final String ACTION_PRE = "cc.winboll.studio.appbase.widgets.WinBollNewsWidgetClickListener.ACTION_PRE";
 | 
			
		||||
    public static final String ACTION_NEXT = "cc.winboll.studio.appbase.widgets.WinBollNewsWidgetClickListener.ACTION_NEXT";
 | 
			
		||||
    public static final String TAG = "APPNewsWidgetClickListener";
 | 
			
		||||
    public static final String ACTION_PRE = APPNewsWidgetClickListener.class.getName() + ".ACTION_PRE";
 | 
			
		||||
    public static final String ACTION_NEXT = APPNewsWidgetClickListener.class.getName() + ".ACTION_NEXT";
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onReceive(Context context, Intent intent) {
 | 
			
		||||
@@ -25,10 +25,10 @@ public class WinBollNewsWidgetClickListener extends BroadcastReceiver {
 | 
			
		||||
        }
 | 
			
		||||
        if (action.equals(ACTION_PRE)) {
 | 
			
		||||
            LogUtils.d(TAG, "ACTION_PRE");
 | 
			
		||||
            WinBollNewsWidget.prePage(context);
 | 
			
		||||
            APPNewsWidget.prePage(context);
 | 
			
		||||
        } else if (action.equals(ACTION_NEXT)) {
 | 
			
		||||
            LogUtils.d(TAG, "ACTION_NEXT");
 | 
			
		||||
            WinBollNewsWidget.nextPage(context);
 | 
			
		||||
            APPNewsWidget.nextPage(context);
 | 
			
		||||
        } else {
 | 
			
		||||
            LogUtils.d(TAG, String.format("action %s", action));
 | 
			
		||||
        }
 | 
			
		||||
@@ -1,17 +1,27 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<LinearLayout
 | 
			
		||||
	xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
	xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
	android:layout_width="match_parent"
 | 
			
		||||
	android:layout_height="match_parent"
 | 
			
		||||
	android:orientation="vertical"
 | 
			
		||||
	android:gravity="center">
 | 
			
		||||
	android:layout_width="match_parent"
 | 
			
		||||
	android:layout_height="match_parent">
 | 
			
		||||
 | 
			
		||||
	<androidx.appcompat.widget.Toolbar
 | 
			
		||||
		android:layout_width="match_parent"
 | 
			
		||||
		android:layout_height="wrap_content"
 | 
			
		||||
		android:id="@+id/activitymainToolbar1"/>
 | 
			
		||||
 | 
			
		||||
	<ScrollView
 | 
			
		||||
		android:layout_width="match_parent"
 | 
			
		||||
		android:layout_height="0dp"
 | 
			
		||||
		android:layout_weight="1.0">
 | 
			
		||||
 | 
			
		||||
		<LinearLayout
 | 
			
		||||
			xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
			android:layout_width="match_parent"
 | 
			
		||||
			android:layout_height="wrap_content"
 | 
			
		||||
			android:orientation="vertical"
 | 
			
		||||
			android:gravity="center">
 | 
			
		||||
 | 
			
		||||
			<LinearLayout
 | 
			
		||||
				android:orientation="vertical"
 | 
			
		||||
				android:layout_width="match_parent"
 | 
			
		||||
@@ -27,9 +37,7 @@
 | 
			
		||||
				<TextView
 | 
			
		||||
					android:layout_width="wrap_content"
 | 
			
		||||
					android:layout_height="wrap_content"
 | 
			
		||||
			android:text="Android版本10的代号是“Q”,API级别是29。   Android 10开始谷歌不再公开使用甜品作为版本代号,但内部仍保留了大量与“Q”相关的元素。Android 10本身并没有严格对应某个特定的Java版本,但在开发Android 10应用时,通常可以使用Java 8或更高版本。
 | 
			
		||||
 
 | 
			
		||||
Java 8为Android开发带来了诸如Lambda表达式、方法引用等新特性,能提高开发效率和代码可读性,与Android 10开发适配良好。Java 9及更高版本也可用于Android 10开发,能使用一些新的语言特性和API,但可能需要注意兼容性和配置问题。"/>
 | 
			
		||||
					android:text="Android版本10的代号是“Q”,API级别是29。   Android 10开始谷歌不再公开使用甜品作为版本代号,但内部仍保留了大量与“Q”相关的元素。Android 10本身并没有严格对应某个特定的Java版本,但在开发Android 10应用时,通常可以使用Java 8或更高版本。   Java 8为Android开发带来了诸如Lambda表达式、方法引用等新特性,能提高开发效率和代码可读性,与Android 10开发适配良好。Java 9及更高版本也可用于Android 10开发,能使用一些新的语言特性和API,但可能需要注意兼容性和配置问题。"/>
 | 
			
		||||
 | 
			
		||||
				<LinearLayout
 | 
			
		||||
					android:orientation="horizontal"
 | 
			
		||||
@@ -76,23 +84,57 @@ Java 8为Android开发带来了诸如Lambda表达式、方法引用等新特性
 | 
			
		||||
								<Button
 | 
			
		||||
									android:layout_width="wrap_content"
 | 
			
		||||
									android:layout_height="wrap_content"
 | 
			
		||||
							android:text="StartTestService"
 | 
			
		||||
									android:text="SartTestDemoService"
 | 
			
		||||
									android:textAllCaps="false"
 | 
			
		||||
							android:onClick="onStartTestService"/>
 | 
			
		||||
									android:onClick="onSartTestDemoService"/>
 | 
			
		||||
 | 
			
		||||
								<Button
 | 
			
		||||
									android:layout_width="wrap_content"
 | 
			
		||||
									android:layout_height="wrap_content"
 | 
			
		||||
							android:text="StopTestService"
 | 
			
		||||
									android:text="StopTestDemoService"
 | 
			
		||||
									android:textAllCaps="false"
 | 
			
		||||
							android:onClick="onStopTestService"/>
 | 
			
		||||
									android:onClick="onStopTestDemoService"/>
 | 
			
		||||
 | 
			
		||||
								<Button
 | 
			
		||||
									android:layout_width="wrap_content"
 | 
			
		||||
									android:layout_height="wrap_content"
 | 
			
		||||
							android:text="StopTestServiceNoSettings"
 | 
			
		||||
									android:text="StopTestDemoServiceNoSettings"
 | 
			
		||||
									android:textAllCaps="false"
 | 
			
		||||
							android:onClick="onStopTestServiceNoSettings"/>
 | 
			
		||||
									android:onClick="onStopTestDemoServiceNoSettings"/>
 | 
			
		||||
 | 
			
		||||
							</LinearLayout>
 | 
			
		||||
 | 
			
		||||
						</HorizontalScrollView>
 | 
			
		||||
                        
 | 
			
		||||
                        <HorizontalScrollView
 | 
			
		||||
                            android:layout_width="match_parent"
 | 
			
		||||
                            android:layout_height="wrap_content">
 | 
			
		||||
 | 
			
		||||
                            <LinearLayout
 | 
			
		||||
                                android:orientation="horizontal"
 | 
			
		||||
                                android:layout_width="wrap_content"
 | 
			
		||||
                                android:layout_height="wrap_content">
 | 
			
		||||
 | 
			
		||||
                                <Button
 | 
			
		||||
                                    android:layout_width="wrap_content"
 | 
			
		||||
                                    android:layout_height="wrap_content"
 | 
			
		||||
                                    android:text="SartTestDemoBindService"
 | 
			
		||||
                                    android:textAllCaps="false"
 | 
			
		||||
                                    android:onClick="onSartTestDemoBindService"/>
 | 
			
		||||
 | 
			
		||||
                                <Button
 | 
			
		||||
                                    android:layout_width="wrap_content"
 | 
			
		||||
                                    android:layout_height="wrap_content"
 | 
			
		||||
                                    android:text="StopTestDemoBindService"
 | 
			
		||||
                                    android:textAllCaps="false"
 | 
			
		||||
                                    android:onClick="onStopTestDemoBindService"/>
 | 
			
		||||
 | 
			
		||||
                                <Button
 | 
			
		||||
                                    android:layout_width="wrap_content"
 | 
			
		||||
                                    android:layout_height="wrap_content"
 | 
			
		||||
                                    android:text="StopTestDemoBindServiceNoSettings"
 | 
			
		||||
                                    android:textAllCaps="false"
 | 
			
		||||
                                    android:onClick="onStopTestDemoBindServiceNoSettings"/>
 | 
			
		||||
 | 
			
		||||
                            </LinearLayout>
 | 
			
		||||
 | 
			
		||||
@@ -115,35 +157,38 @@ Java 8为Android开发带来了诸如Lambda表达式、方法引用等新特性
 | 
			
		||||
						<Button
 | 
			
		||||
							android:layout_width="wrap_content"
 | 
			
		||||
							android:layout_height="wrap_content"
 | 
			
		||||
					android:text="TestStopWithoutSettingEnable"
 | 
			
		||||
							android:text="TestStopMainServiceWithoutSettingEnable"
 | 
			
		||||
							android:textAllCaps="false"
 | 
			
		||||
					android:onClick="onTestStopWithoutSettingEnable"/>
 | 
			
		||||
							android:onClick="onTestStopMainServiceWithoutSettingEnable"/>
 | 
			
		||||
 | 
			
		||||
						<Button
 | 
			
		||||
							android:layout_width="wrap_content"
 | 
			
		||||
							android:layout_height="wrap_content"
 | 
			
		||||
					android:text="TestStartWithString"
 | 
			
		||||
							android:text="TestUseComponentStartService"
 | 
			
		||||
							android:textAllCaps="false"
 | 
			
		||||
					android:onClick="onTestStartWithString"/>
 | 
			
		||||
							android:onClick="onTestUseComponentStartService"/>
 | 
			
		||||
 | 
			
		||||
						<Button
 | 
			
		||||
							android:layout_width="wrap_content"
 | 
			
		||||
							android:layout_height="wrap_content"
 | 
			
		||||
					android:text="SOS"
 | 
			
		||||
							android:text="TestSOS"
 | 
			
		||||
							android:textAllCaps="false"
 | 
			
		||||
					android:onClick="onSOS"/>
 | 
			
		||||
							android:onClick="onTestSOS"/>
 | 
			
		||||
 | 
			
		||||
					</LinearLayout>
 | 
			
		||||
 | 
			
		||||
				</ScrollView>
 | 
			
		||||
 | 
			
		||||
				<cc.winboll.studio.libappbase.LogView
 | 
			
		||||
			android:layout_weight="1.0"
 | 
			
		||||
			android:layout_height="0dp"
 | 
			
		||||
					android:layout_height="500dp"
 | 
			
		||||
					android:layout_width="match_parent"
 | 
			
		||||
					android:id="@+id/activitymainLogView1"/>
 | 
			
		||||
 | 
			
		||||
			</LinearLayout>
 | 
			
		||||
 | 
			
		||||
		</LinearLayout>
 | 
			
		||||
 | 
			
		||||
	</ScrollView>
 | 
			
		||||
 | 
			
		||||
</LinearLayout>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										24
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								build.gradle
									
									
									
									
									
								
							@@ -1,6 +1,12 @@
 | 
			
		||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
 | 
			
		||||
buildscript {
 | 
			
		||||
    repositories {
 | 
			
		||||
        // Nexus Maven 库地址
 | 
			
		||||
        // "WinBoll Release"
 | 
			
		||||
        maven { url "https://nexus.winboll.cc/repository/maven-public/" }
 | 
			
		||||
        // "WinBoll Snapshot"
 | 
			
		||||
        maven { url "https://nexus.winboll.cc/repository/maven-snapshots/" }
 | 
			
		||||
        
 | 
			
		||||
        maven { url 'https://maven.aliyun.com/repository/public/' } 
 | 
			
		||||
        maven { url 'https://maven.aliyun.com/repository/google/' }
 | 
			
		||||
        maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }
 | 
			
		||||
@@ -10,12 +16,6 @@ buildscript {
 | 
			
		||||
        mavenCentral()
 | 
			
		||||
        google()
 | 
			
		||||
        mavenLocal()
 | 
			
		||||
        // Nexus Maven 库地址
 | 
			
		||||
        // "WinBoll Release"
 | 
			
		||||
        maven { url "https://nexus.winboll.cc/repository/maven-public/" }
 | 
			
		||||
        // "WinBoll Snapshot"
 | 
			
		||||
        maven { url "https://nexus.winboll.cc/repository/maven-snapshots/" }
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
    dependencies {
 | 
			
		||||
        classpath 'com.android.tools.build:gradle:7.2.1'
 | 
			
		||||
@@ -26,6 +26,12 @@ buildscript {
 | 
			
		||||
 | 
			
		||||
allprojects {
 | 
			
		||||
    repositories {
 | 
			
		||||
        // Nexus Maven 库地址
 | 
			
		||||
        // "WinBoll Release"
 | 
			
		||||
        maven { url "https://nexus.winboll.cc/repository/maven-public/" }
 | 
			
		||||
        // "WinBoll Snapshot"
 | 
			
		||||
        maven { url "https://nexus.winboll.cc/repository/maven-snapshots/" }
 | 
			
		||||
        
 | 
			
		||||
        maven {
 | 
			
		||||
            url "https://mirrors.tencent.com/repository/maven/tencent_public/"
 | 
			
		||||
        }
 | 
			
		||||
@@ -42,12 +48,6 @@ allprojects {
 | 
			
		||||
        mavenCentral()
 | 
			
		||||
        google()
 | 
			
		||||
        mavenLocal()
 | 
			
		||||
        // Nexus Maven 库地址
 | 
			
		||||
        // "WinBoll Release"
 | 
			
		||||
        maven { url "https://nexus.winboll.cc/repository/maven-public/" }
 | 
			
		||||
        // "WinBoll Snapshot"
 | 
			
		||||
        maven { url "https://nexus.winboll.cc/repository/maven-snapshots/" }
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
    ext {
 | 
			
		||||
        // 定义全局变量,常用于版本管理
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,10 @@ android {
 | 
			
		||||
dependencies {
 | 
			
		||||
    implementation fileTree(dir: 'libs', include: ['*.jar'])
 | 
			
		||||
    
 | 
			
		||||
    // SSH
 | 
			
		||||
    implementation 'com.jcraft:jsch:0.1.55'
 | 
			
		||||
    // Html 解析
 | 
			
		||||
    implementation 'org.jsoup:jsoup:1.13.1'
 | 
			
		||||
    // 二维码类库
 | 
			
		||||
    implementation 'com.google.zxing:core:3.4.1'
 | 
			
		||||
    implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
#Created by .winboll/winboll_app_build.gradle
 | 
			
		||||
#Thu Feb 27 02:21:32 GMT 2025
 | 
			
		||||
stageCount=3
 | 
			
		||||
#Sat Mar 08 02:31:02 HKT 2025
 | 
			
		||||
stageCount=2
 | 
			
		||||
libraryProject=libappbase
 | 
			
		||||
baseVersion=2.0
 | 
			
		||||
publishVersion=2.0.2
 | 
			
		||||
buildCount=4
 | 
			
		||||
baseBetaVersion=2.0.3
 | 
			
		||||
baseVersion=2.1
 | 
			
		||||
publishVersion=2.1.1
 | 
			
		||||
buildCount=0
 | 
			
		||||
baseBetaVersion=2.1.2
 | 
			
		||||
 
 | 
			
		||||
@@ -1,24 +0,0 @@
 | 
			
		||||
package cc.winboll.studio.libappbase;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@QQ.COM
 | 
			
		||||
 * @Date 2025/02/04 10:20:16
 | 
			
		||||
 * @Describe WinBoll Activity 接口
 | 
			
		||||
 */
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity;
 | 
			
		||||
import androidx.appcompat.widget.Toolbar;
 | 
			
		||||
import cc.winboll.studio.libappbase.bean.APPInfo;
 | 
			
		||||
 | 
			
		||||
public interface IWinBollActivity {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "IWinBollActivity";
 | 
			
		||||
 | 
			
		||||
    // 获取当前具有 IWinBoll 特征的 AppCompatActivity 活动窗口
 | 
			
		||||
    AppCompatActivity getActivity();
 | 
			
		||||
 | 
			
		||||
    abstract public APPInfo getAppInfo();
 | 
			
		||||
    abstract public String getTag();
 | 
			
		||||
    abstract Toolbar initToolBar();
 | 
			
		||||
    abstract boolean isEnableDisplayHomeAsUp();
 | 
			
		||||
    abstract boolean isAddWinBollToolBar();
 | 
			
		||||
}
 | 
			
		||||
@@ -1,68 +0,0 @@
 | 
			
		||||
package cc.winboll.studio.libappbase;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@QQ.COM
 | 
			
		||||
 * @Date 2024/08/12 15:07:58
 | 
			
		||||
 * @Describe WinBoll 应用日志窗口
 | 
			
		||||
 */
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity;
 | 
			
		||||
import androidx.appcompat.widget.Toolbar;
 | 
			
		||||
import cc.winboll.studio.libappbase.GlobalApplication;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.libappbase.bean.APPInfo;
 | 
			
		||||
import cc.winboll.studio.libappbase.R;
 | 
			
		||||
 | 
			
		||||
public class LogActivity extends AppCompatActivity implements IWinBollActivity {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "LogActivity";
 | 
			
		||||
 | 
			
		||||
    LogView mLogView;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public AppCompatActivity getActivity() {
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public APPInfo getAppInfo() {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getTag() {
 | 
			
		||||
        return TAG;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Toolbar initToolBar() {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isEnableDisplayHomeAsUp() {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isAddWinBollToolBar() {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        LogUtils.d(TAG, "onCreate");
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
        setContentView(R.layout.activity_log);
 | 
			
		||||
        mLogView = findViewById(R.id.logview);
 | 
			
		||||
 | 
			
		||||
        if (GlobalApplication.isDebuging()) { mLogView.start(); }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onResume() {
 | 
			
		||||
        LogUtils.d(TAG, "onResume");
 | 
			
		||||
        super.onResume();
 | 
			
		||||
        mLogView.start();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,142 +0,0 @@
 | 
			
		||||
package cc.winboll.studio.libappbase.bean;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@QQ.COM
 | 
			
		||||
 * @Date 2025/01/20 14:19:02
 | 
			
		||||
 * @Describe 应用信息类
 | 
			
		||||
 */
 | 
			
		||||
import cc.winboll.studio.libappbase.R;
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
 | 
			
		||||
public class APPInfo implements Serializable {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "APPInfo";
 | 
			
		||||
 | 
			
		||||
    // 应用名称
 | 
			
		||||
    String appName;
 | 
			
		||||
    // 应用图标
 | 
			
		||||
    int appIcon;
 | 
			
		||||
    // 应用描述
 | 
			
		||||
    String appDescription;
 | 
			
		||||
    // 应用Git仓库地址
 | 
			
		||||
    String appGitName;
 | 
			
		||||
    // 应用Git仓库拥有者
 | 
			
		||||
    String appGitOwner;
 | 
			
		||||
    // 应用Git仓库分支
 | 
			
		||||
    String appGitAPPBranch;
 | 
			
		||||
    // 应用Git仓库子项目文件夹
 | 
			
		||||
    String appGitAPPSubProjectFolder;
 | 
			
		||||
    // 应用主页
 | 
			
		||||
    String appHomePage;
 | 
			
		||||
    // 应用包名称
 | 
			
		||||
    String appAPKName;
 | 
			
		||||
    // 应用包存储文件夹名称
 | 
			
		||||
    String appAPKFolderName;
 | 
			
		||||
 | 
			
		||||
    public APPInfo(String appName, int appIcon, String appDescription, String appGitName, String appGitOwner, String appGitAPPBranch, String appGitAPPSubProjectFolder, String appHomePage, String appAPKName, String appAPKFolderName) {
 | 
			
		||||
        this.appName = appName;
 | 
			
		||||
        this.appIcon = appIcon;
 | 
			
		||||
        this.appDescription = appDescription;
 | 
			
		||||
        this.appGitName = appGitName;
 | 
			
		||||
        this.appGitOwner = appGitOwner;
 | 
			
		||||
        this.appGitAPPBranch = appGitAPPBranch;
 | 
			
		||||
        this.appGitAPPSubProjectFolder = appGitAPPSubProjectFolder;
 | 
			
		||||
        this.appHomePage = appHomePage;
 | 
			
		||||
        this.appAPKName = appAPKName;
 | 
			
		||||
        this.appAPKFolderName = appAPKFolderName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public APPInfo() {
 | 
			
		||||
        this.appName = "WinBoll-APP";
 | 
			
		||||
        this.appIcon = R.drawable.ic_launcher;
 | 
			
		||||
        this.appDescription = "WinBoll APP";
 | 
			
		||||
        this.appGitName = "APP";
 | 
			
		||||
        this.appGitOwner = "Studio";
 | 
			
		||||
        this.appGitAPPBranch = "app";
 | 
			
		||||
        this.appGitAPPSubProjectFolder = "app";
 | 
			
		||||
        this.appHomePage = "https://www.winboll.cc/studio/details.php?app=APP";
 | 
			
		||||
        this.appAPKName = "APP";
 | 
			
		||||
        this.appAPKFolderName = "APP";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAppGitOwner(String appGitOwner) {
 | 
			
		||||
        this.appGitOwner = appGitOwner;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getAppGitOwner() {
 | 
			
		||||
        return appGitOwner;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAppGitAPPBranch(String appGitAPPBranch) {
 | 
			
		||||
        this.appGitAPPBranch = appGitAPPBranch;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getAppGitAPPBranch() {
 | 
			
		||||
        return appGitAPPBranch;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAppGitAPPSubProjectFolder(String appGitAPPSubProjectFolder) {
 | 
			
		||||
        this.appGitAPPSubProjectFolder = appGitAPPSubProjectFolder;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getAppGitAPPSubProjectFolder() {
 | 
			
		||||
        return appGitAPPSubProjectFolder;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAppIcon(int appIcon) {
 | 
			
		||||
        this.appIcon = appIcon;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getAppIcon() {
 | 
			
		||||
        return appIcon;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAppDescription(String appDescription) {
 | 
			
		||||
        this.appDescription = appDescription;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getAppDescription() {
 | 
			
		||||
        return appDescription;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAppAPKFolderName(String appAPKFolderName) {
 | 
			
		||||
        this.appAPKFolderName = appAPKFolderName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getAppAPKFolderName() {
 | 
			
		||||
        return appAPKFolderName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAppName(String appName) {
 | 
			
		||||
        this.appName = appName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getAppName() {
 | 
			
		||||
        return appName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAppGitName(String appGitName) {
 | 
			
		||||
        this.appGitName = appGitName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getAppGitName() {
 | 
			
		||||
        return appGitName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAppHomePage(String appHomePage) {
 | 
			
		||||
        this.appHomePage = appHomePage;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getAppHomePage() {
 | 
			
		||||
        return appHomePage;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAppAPKName(String appAPKName) {
 | 
			
		||||
        this.appAPKName = appAPKName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getAppAPKName() {
 | 
			
		||||
        return appAPKName;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -34,13 +34,13 @@ public class SOS {
 | 
			
		||||
    static void sos(Context context, String szToPackage, String sosService) {
 | 
			
		||||
        LogUtils.d(TAG, "sos(...)");
 | 
			
		||||
        Intent intent = new Intent(ACTION_SOS);
 | 
			
		||||
        intent.putExtra(EXTRA_OBJECT, genSOSObjectString(context.getPackageName(), sosService));
 | 
			
		||||
        intent.putExtra(EXTRA_OBJECT, genSOSObject(context.getPackageName(), sosService));
 | 
			
		||||
        intent.setPackage(szToPackage);
 | 
			
		||||
        LogUtils.d(TAG, String.format("ACTION_SOS :\nTo Package : %sSOS Service : %s\n", szToPackage, sosService));
 | 
			
		||||
        context.sendBroadcast(intent);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static SOSObject stringToSOSObject(String szSOSObject) {
 | 
			
		||||
    public static SOSObject parseSOSObject(String szSOSObject) {
 | 
			
		||||
        try {
 | 
			
		||||
            return SOSObject.parseStringToBean(szSOSObject, SOSObject.class);
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
@@ -49,11 +49,11 @@ public class SOS {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static String sosObjectToString(SOSObject object) {
 | 
			
		||||
    public static String sosObjectToString(SOSObject object) {
 | 
			
		||||
        return object.toString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static String genSOSObjectString(String objectPackageName, String objectServiveName) {
 | 
			
		||||
    public static String genSOSObject(String objectPackageName, String objectServiveName) {
 | 
			
		||||
        return (new SOSObject(objectPackageName, objectServiveName)).toString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,5 @@
 | 
			
		||||
package cc.winboll.studio.libappbase.sos;
 | 
			
		||||
 | 
			
		||||
import android.app.Service;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.os.IBinder;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@AliYun.Com
 | 
			
		||||
 * @Date 2025/02/27 14:00:21
 | 
			
		||||
@@ -17,8 +13,11 @@ import android.os.IBinder;
 | 
			
		||||
import android.os.IInterface;
 | 
			
		||||
import android.os.Parcel;
 | 
			
		||||
import android.os.RemoteException;
 | 
			
		||||
import cc.winboll.studio.libappbase.bean.SimpleOperateSignalCenterServiceBean;
 | 
			
		||||
import java.io.FileDescriptor;
 | 
			
		||||
import android.app.Service;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.os.IBinder;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
 | 
			
		||||
public class SOSCenterService extends Service {
 | 
			
		||||
 | 
			
		||||
@@ -26,7 +25,7 @@ public class SOSCenterService extends Service {
 | 
			
		||||
    
 | 
			
		||||
    private final IBinder binder =(IBinder)new SOSBinder();
 | 
			
		||||
 | 
			
		||||
    SimpleOperateSignalCenterServiceBean mSimpleOperateSignalCenterServiceBean;
 | 
			
		||||
    SOSCenterServiceModel mSOSCenterServiceModel;
 | 
			
		||||
    static MainThread _MainThread;
 | 
			
		||||
    public static synchronized MainThread getMainThreadInstance() {
 | 
			
		||||
        if (_MainThread == null) {
 | 
			
		||||
@@ -85,8 +84,8 @@ public class SOSCenterService extends Service {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static final String TAG = "SOSBinder";
 | 
			
		||||
        SimpleOperateSignalCenterService getService() {
 | 
			
		||||
            return SimpleOperateSignalCenterService.this;
 | 
			
		||||
        SOSCenterService getService() {
 | 
			
		||||
            return SOSCenterService.this;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -94,10 +93,10 @@ public class SOSCenterService extends Service {
 | 
			
		||||
    public void onCreate() {
 | 
			
		||||
        super.onCreate();
 | 
			
		||||
        LogUtils.d(TAG, "onCreate");
 | 
			
		||||
        mSimpleOperateSignalCenterServiceBean = SimpleOperateSignalCenterServiceBean.loadBean(this, SimpleOperateSignalCenterServiceBean.class);
 | 
			
		||||
        if(mSimpleOperateSignalCenterServiceBean == null) {
 | 
			
		||||
            mSimpleOperateSignalCenterServiceBean = new SimpleOperateSignalCenterServiceBean();
 | 
			
		||||
            SimpleOperateSignalCenterServiceBean.saveBean(this, mSimpleOperateSignalCenterServiceBean);
 | 
			
		||||
        mSOSCenterServiceModel = SOSCenterServiceModel.loadBean(this, SOSCenterServiceModel.class);
 | 
			
		||||
        if(mSOSCenterServiceModel == null) {
 | 
			
		||||
            mSOSCenterServiceModel = new SOSCenterServiceModel();
 | 
			
		||||
            SOSCenterServiceModel.saveBean(this, mSOSCenterServiceModel);
 | 
			
		||||
        }
 | 
			
		||||
        runMainThread();
 | 
			
		||||
    }
 | 
			
		||||
@@ -108,12 +107,12 @@ public class SOSCenterService extends Service {
 | 
			
		||||
 | 
			
		||||
        runMainThread();
 | 
			
		||||
 | 
			
		||||
        return mSimpleOperateSignalCenterServiceBean.isEnable() ? Service.START_STICKY: super.onStartCommand(intent, flags, startId);
 | 
			
		||||
        return mSOSCenterServiceModel.isEnable() ? Service.START_STICKY: super.onStartCommand(intent, flags, startId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void runMainThread() {
 | 
			
		||||
        mSimpleOperateSignalCenterServiceBean = SimpleOperateSignalCenterServiceBean.loadBean(this, SimpleOperateSignalCenterServiceBean.class);
 | 
			
		||||
        if (mSimpleOperateSignalCenterServiceBean.isEnable()
 | 
			
		||||
        mSOSCenterServiceModel = mSOSCenterServiceModel.loadBean(this, SOSCenterServiceModel.class);
 | 
			
		||||
        if (mSOSCenterServiceModel.isEnable()
 | 
			
		||||
            && _MainThread == null) {
 | 
			
		||||
            getMainThreadInstance().start();
 | 
			
		||||
        }
 | 
			
		||||
@@ -123,9 +122,9 @@ public class SOSCenterService extends Service {
 | 
			
		||||
    public void onDestroy() {
 | 
			
		||||
        super.onDestroy();
 | 
			
		||||
        LogUtils.d(TAG, "onDestroy");
 | 
			
		||||
        mSimpleOperateSignalCenterServiceBean = SimpleOperateSignalCenterServiceBean.loadBean(this, SimpleOperateSignalCenterServiceBean.class);
 | 
			
		||||
        if (mSimpleOperateSignalCenterServiceBean.isEnable()) {
 | 
			
		||||
            LogUtils.d(TAG, "mSimpleOperateSignalCenterServiceBean.isEnable()");
 | 
			
		||||
        mSOSCenterServiceModel = SOSCenterServiceModel.loadBean(this, SOSCenterServiceModel.class);
 | 
			
		||||
        if (mSOSCenterServiceModel.isEnable()) {
 | 
			
		||||
            LogUtils.d(TAG, "mSOSCenterServiceModel.isEnable()");
 | 
			
		||||
//            ISOSAPP iSOSAPP = (ISOSAPP)getApplication();
 | 
			
		||||
//            iSOSAPP.helpISOSService(getISOSServiceIntentWhichAskForHelp());
 | 
			
		||||
        } 
 | 
			
		||||
@@ -137,22 +136,22 @@ public class SOSCenterService extends Service {
 | 
			
		||||
 | 
			
		||||
    public static void stopISOSService(Context context) {
 | 
			
		||||
        LogUtils.d(TAG, "stopISOSService");
 | 
			
		||||
        SimpleOperateSignalCenterServiceBean bean = new SimpleOperateSignalCenterServiceBean();
 | 
			
		||||
        SOSCenterServiceModel bean = new SOSCenterServiceModel();
 | 
			
		||||
        bean.setIsEnable(false);
 | 
			
		||||
        SimpleOperateSignalCenterServiceBean.saveBean(context, bean);
 | 
			
		||||
        context.stopService(new Intent(context, SimpleOperateSignalCenterService.class));
 | 
			
		||||
        SOSCenterServiceModel.saveBean(context, bean);
 | 
			
		||||
        context.stopService(new Intent(context, SOSCenterServiceModel.class));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void startISOSService(Context context) {
 | 
			
		||||
        LogUtils.d(TAG, "startISOSService");
 | 
			
		||||
        SimpleOperateSignalCenterServiceBean bean = new SimpleOperateSignalCenterServiceBean();
 | 
			
		||||
        SOSCenterServiceModel bean = new SOSCenterServiceModel();
 | 
			
		||||
        bean.setIsEnable(true);
 | 
			
		||||
        SimpleOperateSignalCenterServiceBean.saveBean(context, bean);
 | 
			
		||||
        context.startService(new Intent(context, SimpleOperateSignalCenterService.class));
 | 
			
		||||
        SOSCenterServiceModel.saveBean(context, bean);
 | 
			
		||||
        context.startService(new Intent(context, SOSCenterServiceModel.class));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getMessage() {
 | 
			
		||||
        return "Hello from SimpleOperateSignalCenterService";
 | 
			
		||||
        return "Hello from SOSCenterServiceModel";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static class MainThread extends Thread {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,24 +1,25 @@
 | 
			
		||||
package cc.winboll.studio.libappbase.sos;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author ZhanGSKen@AliYun.Com
 | 
			
		||||
 * @Date 2025/02/27 14:04:35
 | 
			
		||||
 * @Describe SOSCenterServiceReceiver
 | 
			
		||||
 */
 | 
			
		||||
import android.content.BroadcastReceiver;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
 | 
			
		||||
public class SOSCenterServiceReceiver extends BroadcastReceiver {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "SOSCenterServiceReceiver";
 | 
			
		||||
 | 
			
		||||
    public static final String ACTION_SOS = SOSCenterServiceReceiver.class.getName() + ".ACTION_SOS";
 | 
			
		||||
    public static final String 
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onReceive(Context context, Intent intent) {
 | 
			
		||||
        String action = intent.getAction();
 | 
			
		||||
        if (action.equals(ACTION_SOS)) {
 | 
			
		||||
            
 | 
			
		||||
            // 处理接收到的广播消息
 | 
			
		||||
            LogUtils.d(TAG, String.format("Action %s \n%s\n%s", action));
 | 
			
		||||
        } else {
 | 
			
		||||
 
 | 
			
		||||
@@ -14,14 +14,16 @@ public class WinBoll {
 | 
			
		||||
    public static final String TAG = "WinBoll";
 | 
			
		||||
 | 
			
		||||
    public static final String ACTION_BIND = WinBoll.class.getName() + ".ACTION_BIND";
 | 
			
		||||
    public static final String EXTRA_APPMODEL = "EXTRA_APP";
 | 
			
		||||
    public static final String EXTRA_APPMODEL = "EXTRA_APPMODEL";
 | 
			
		||||
 | 
			
		||||
    public static void bindToAPPBase(Context context, String appMainService) {
 | 
			
		||||
        LogUtils.d(TAG, "bindToAPPBase(...)");
 | 
			
		||||
        String toPackage = "cc.winboll.studio.appbase";
 | 
			
		||||
        startBind(context, toPackage, appMainService);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void bindToAPPBaseBeta(Context context, String appMainService) {
 | 
			
		||||
        LogUtils.d(TAG, "bindToAPPBaseBeta(...)");
 | 
			
		||||
        String toPackage = "cc.winboll.studio.appbase.beta";
 | 
			
		||||
        startBind(context, toPackage, appMainService);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,6 @@ import cc.winboll.studio.libappbase.utils.ServiceUtils;
 | 
			
		||||
import com.hjq.toast.ToastUtils;
 | 
			
		||||
import android.content.ServiceConnection;
 | 
			
		||||
import android.os.IBinder;
 | 
			
		||||
import cc.winboll.studio.libappbase.services.TestService;
 | 
			
		||||
 | 
			
		||||
public class StatusWidget extends AppWidgetProvider {
 | 
			
		||||
 | 
			
		||||
@@ -52,12 +51,12 @@ public class StatusWidget extends AppWidgetProvider {
 | 
			
		||||
        PendingIntent pendingIntentAppButton = PendingIntent.getBroadcast(context, 0, intentAppButton, PendingIntent.FLAG_UPDATE_CURRENT);
 | 
			
		||||
        views.setOnClickPendingIntent(R.id.ivapp, pendingIntentAppButton);
 | 
			
		||||
 | 
			
		||||
        boolean isActive = ServiceUtils.isServiceRunning(context, TestService.class.getName());
 | 
			
		||||
        if (isActive) {
 | 
			
		||||
            views.setImageViewResource(R.id.ivapp, cc.winboll.studio.libappbase.R.drawable.ic_launcher);
 | 
			
		||||
        } else {
 | 
			
		||||
            views.setImageViewResource(R.id.ivapp, cc.winboll.studio.libappbase.R.drawable.ic_launcher_disable);
 | 
			
		||||
        }
 | 
			
		||||
//        boolean isActive = ServiceUtils.isServiceRunning(context, TestService.class.getName());
 | 
			
		||||
//        if (isActive) {
 | 
			
		||||
//            views.setImageViewResource(R.id.ivapp, cc.winboll.studio.libappbase.R.drawable.ic_launcher);
 | 
			
		||||
//        } else {
 | 
			
		||||
//            views.setImageViewResource(R.id.ivapp, cc.winboll.studio.libappbase.R.drawable.ic_launcher_disable);
 | 
			
		||||
//        }
 | 
			
		||||
        appWidgetManager.updateAppWidget(appWidgetId, views);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user