background service
This commit is contained in:
		
							parent
							
								
									eb3f3afa60
								
							
						
					
					
						commit
						16388ea9b9
					
				@ -19,10 +19,10 @@ apply plugin: 'com.android.library'
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
android {
 | 
					android {
 | 
				
			||||||
    namespace "software.eskimo.capacitor.sockets"
 | 
					    namespace "software.eskimo.capacitor.sockets"
 | 
				
			||||||
    compileSdk project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 34
 | 
					    compileSdk project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 35
 | 
				
			||||||
    defaultConfig {
 | 
					    defaultConfig {
 | 
				
			||||||
        minSdkVersion project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 22
 | 
					        minSdkVersion project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 22
 | 
				
			||||||
        targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 34
 | 
					        targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 35
 | 
				
			||||||
        versionCode 1
 | 
					        versionCode 1
 | 
				
			||||||
        versionName "1.0"
 | 
					        versionName "1.0"
 | 
				
			||||||
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 | 
					        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 | 
				
			||||||
 | 
				
			|||||||
@ -1,2 +1,11 @@
 | 
				
			|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
 | 
					<manifest xmlns:android="http://schemas.android.com/apk/res/android">
 | 
				
			||||||
 | 
						<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
 | 
				
			||||||
 | 
						<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
 | 
				
			||||||
 | 
					    <application>
 | 
				
			||||||
 | 
					        <service
 | 
				
			||||||
 | 
							    android:name=".SocketForegroundService"
 | 
				
			||||||
 | 
							    android:enabled="true"
 | 
				
			||||||
 | 
							    android:exported="false"
 | 
				
			||||||
 | 
							    android:foregroundServiceType="dataSync" />
 | 
				
			||||||
 | 
					    </application>
 | 
				
			||||||
</manifest>
 | 
					</manifest>
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,71 @@
 | 
				
			|||||||
 | 
					package software.eskimo.capacitor.sockets;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.app.Notification;
 | 
				
			||||||
 | 
					import android.app.NotificationChannel;
 | 
				
			||||||
 | 
					import android.app.NotificationManager;
 | 
				
			||||||
 | 
					import android.app.Service;
 | 
				
			||||||
 | 
					import android.content.Context;
 | 
				
			||||||
 | 
					import android.content.Intent;
 | 
				
			||||||
 | 
					import android.content.pm.ServiceInfo;
 | 
				
			||||||
 | 
					import android.os.Build;
 | 
				
			||||||
 | 
					import android.os.IBinder;
 | 
				
			||||||
 | 
					import androidx.core.app.NotificationCompat;
 | 
				
			||||||
 | 
					import android.util.Log;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class SocketForegroundService extends Service {
 | 
				
			||||||
 | 
					    private static final String CHANNEL_ID = "socket_channel";
 | 
				
			||||||
 | 
					    private static final String CHANNEL_NAME = "Socket Service Channel";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void onCreate() {
 | 
				
			||||||
 | 
					        super.onCreate();
 | 
				
			||||||
 | 
					        createNotificationChannel();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int onStartCommand(Intent intent, int flags, int startId) {
 | 
				
			||||||
 | 
					        // Retrieve the main app's "app_name" string resource
 | 
				
			||||||
 | 
					        int appNameResId = getResources().getIdentifier("app_name", "string", getApplicationContext().getPackageName());
 | 
				
			||||||
 | 
					        String appName = (appNameResId != 0) ? getString(appNameResId) : "Socket Service";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int iconResId = getResources().getIdentifier("ic_notification", "drawable", getApplicationContext().getPackageName());
 | 
				
			||||||
 | 
					        if (iconResId == 0) {
 | 
				
			||||||
 | 
					            iconResId = android.R.drawable.ic_dialog_info;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
 | 
				
			||||||
 | 
					            .setContentTitle(appName)
 | 
				
			||||||
 | 
					            .setContentText("Background service is running")
 | 
				
			||||||
 | 
					            .setSmallIcon(iconResId)
 | 
				
			||||||
 | 
					            .build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
 | 
				
			||||||
 | 
					            startForeground(1, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            startForeground(1, notification);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        Log.d("SocketForegroundService", "Foreground service started with app name: " + appName);
 | 
				
			||||||
 | 
					        return START_STICKY;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void createNotificationChannel() {
 | 
				
			||||||
 | 
					        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
 | 
				
			||||||
 | 
					            NotificationChannel channel = new NotificationChannel(
 | 
				
			||||||
 | 
					                CHANNEL_ID,
 | 
				
			||||||
 | 
					                CHANNEL_NAME,
 | 
				
			||||||
 | 
					                NotificationManager.IMPORTANCE_LOW
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            channel.setDescription("Channel for socket foreground service");
 | 
				
			||||||
 | 
					            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 | 
				
			||||||
 | 
					            if (notificationManager != null) {
 | 
				
			||||||
 | 
					                notificationManager.createNotificationChannel(channel);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public IBinder onBind(Intent intent) {
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
package software.eskimo.capacitor.sockets;
 | 
					package software.eskimo.capacitor.sockets;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.content.Intent;
 | 
				
			||||||
import android.util.Log;
 | 
					import android.util.Log;
 | 
				
			||||||
import com.getcapacitor.JSObject;
 | 
					import com.getcapacitor.JSObject;
 | 
				
			||||||
import com.getcapacitor.Plugin;
 | 
					import com.getcapacitor.Plugin;
 | 
				
			||||||
@ -27,6 +28,9 @@ public class SocketsPlugin extends Plugin {
 | 
				
			|||||||
        boolean useTLS = call.getBoolean("useTLS", false);
 | 
					        boolean useTLS = call.getBoolean("useTLS", false);
 | 
				
			||||||
        boolean acceptInvalidCertificates = call.getBoolean("acceptInvalidCertificates", false);
 | 
					        boolean acceptInvalidCertificates = call.getBoolean("acceptInvalidCertificates", false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Start the foreground service to keep the socket connection alive in the background
 | 
				
			||||||
 | 
					        startSocketForegroundService();
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        implementation.connect(id, host, port, useTLS, acceptInvalidCertificates);
 | 
					        implementation.connect(id, host, port, useTLS, acceptInvalidCertificates);
 | 
				
			||||||
        call.resolve();
 | 
					        call.resolve();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -59,10 +63,16 @@ public class SocketsPlugin extends Plugin {
 | 
				
			|||||||
    public void notifyMessageListeners(String id, String message) {
 | 
					    public void notifyMessageListeners(String id, String message) {
 | 
				
			||||||
        JSObject data = new JSObject();
 | 
					        JSObject data = new JSObject();
 | 
				
			||||||
        data.put("id", id);
 | 
					        data.put("id", id);
 | 
				
			||||||
        data.put("message", message);  // Include the message content
 | 
					        data.put("message", message);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        Log.d("SocketsPlugin", "Message to JS: " + data.toString());  // Log the data being sent to JS
 | 
					        Log.d("SocketsPlugin", "Message to JS: " + data.toString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        notifyListeners("message", data);  // Notify JS listeners of the 'message' event
 | 
					        notifyListeners("message", data);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Method to start the foreground service
 | 
				
			||||||
 | 
					    private void startSocketForegroundService() {
 | 
				
			||||||
 | 
					        Intent serviceIntent = new Intent(getContext(), SocketForegroundService.class);
 | 
				
			||||||
 | 
					        getContext().startForegroundService(serviceIntent);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user