Search code examples
androidclassbroadcastreceiverandroid-intentservice

starting BroadcastReceiver or IntentService from non-activity class


How to start BroadcastReceiver or IntentService from non-activity class

by start I mean send intent and make run BroadcastService or IntentService

I.e:

I have class:

public class NumberOne{
     @Override
     public int functionOne(){
       int i = 1 + 4;

        if(/*something is true*/){
        Intent intent = new Intent(this,intetServiceOne.class);
        intent.putExtra("id","path");
        context.startService(intent);
      }
      else {/*continue*/
      }
        return i;  
      }
       //other functions
     } 

and if a condition in functionOne is true start IntentService

public class IntentServiceClassOne extends IntentService {
     public IntentServiceClassOne () {
        super("IntentServiceClassOne ");
     }

    @Override
    protected void onHandleIntent(Intent intent) {
    String data = intent.getStringExtra("id");
        Log.d("dataIs: ", data);
    }
    //more functions what to do
    }

It dont depend if it is IntentService or BroadcastReceiver Thanks


Solution

  • To start service You need context instance. You can pass it as constructor parameter:

    public class NumberOne{
         Context context;
    
         public NumberOne(Context context){
             this.context = context;
         }
         public int functionOne(Context context){
           int i = 1 + 4;
    
            if(/*something is true*/){
               Intent intent = new Intent(this,intetServiceOne.class);
               intent.putExtra("id","path");
               context.startService(intent);
            }
            else {/*continue*/
            }
            return i;  
        }
        //other functions
    } 
    

    You don't have to pass Activity instance, Context is enough. It can be application context. You can get it by getApplicationContext() method

    You can also create static instance in Application object and get it from them:

    public class YourApplication extends Application {
    
        public static YourApplication INSTANCE;
    
        public void onCreate(){
            super.onCreate();
    
            INSTANCE = this;
        }
    }
    

    And your class will be look like below.

    public class NumberOne{
    
         public int functionOne(Context context){
           int i = 1 + 4;
    
            if(/*something is true*/){
               Intent intent = new Intent(this,intetServiceOne.class);
               intent.putExtra("id","path");
               YourApplication.INSTANCE.startService(intent);
            }
            else {/*continue*/
            }
            return i;  
        }
        //other functions
    } 
    

    But is not good solution.

    And the last you can create callback listener and set it in your class like below:

    public class NumberOne{
         //add setter
         YourListener yourListener;
         public int functionOne(Context context){
           int i = 1 + 4;
    
            if(/*something is true*/){
               if(yourListener != null){
                   yourListener.onFunctionOneCall();
               }
            }
            else {/*continue*/
            }
            return i;  
        }
        //other functions
    
        public interface YourListener{
            void onFunctionOneCall();
        }
    } 
    

    And some place where you have context - for example in activity:

    numberOneInstance.setYourListener(new YourListener(){
        @Override
        public void onFunctionOneCall(){
                   Intent intent = new Intent(this,intetServiceOne.class);
                   intent.putExtra("id","path");
                   this.startService(intent);
        }
    });
    

    or you can set context by setter

    public class NumberOne{
         Context context;
    
         public setContext(Context context){
             this.context = context;
         }
         public int functionOne(Context context){
           int i = 1 + 4;
    
            if(/*something is true*/){
               if(context != null){
                  Intent intent = new Intent(this,intetServiceOne.class);
                  intent.putExtra("id","path");
                  context.startService(intent);
               }
            }
            else {/*continue*/
            }
            return i;  
        }
        //other functions
    }