Robotics
Robotics

Reputation: 129

Sending email using Android services

I want to send an Email at particular date. I am developing a service will be sending email at particular date. I spent hours trying to figure out for how to send an email at particular date in service background even if my keypad is lock. Can someone help me how to do this?

Here is Log Cat Info

08-16 15:18:00.122: E/AndroidRuntime(632): java.lang.RuntimeException: Unable to start service com.demo.EmailService@40561c20 with Intent { cmp=com.demo/.EmailService }: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
08-16 15:18:00.122: E/AndroidRuntime(632):  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2052)
08-16 15:18:00.122: E/AndroidRuntime(632):  at android.app.ActivityThread.access$2800(ActivityThread.java:117)
08-16 15:18:00.122: E/AndroidRuntime(632):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:994)
08-16 15:18:00.122: E/AndroidRuntime(632):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-16 15:18:00.122: E/AndroidRuntime(632):  at android.os.Looper.loop(Looper.java:123)
08-16 15:18:00.122: E/AndroidRuntime(632):  at android.app.ActivityThread.main(ActivityThread.java:3683)
08-16 15:18:00.122: E/AndroidRuntime(632):  at java.lang.reflect.Method.invokeNative(Native Method)
08-16 15:18:00.122: E/AndroidRuntime(632):  at java.lang.reflect.Method.invoke(Method.java:507)
08-16 15:18:00.122: E/AndroidRuntime(632):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-16 15:18:00.122: E/AndroidRuntime(632):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-16 15:18:00.122: E/AndroidRuntime(632):  at dalvik.system.NativeStart.main(Native Method)
08-16 15:18:00.122: E/AndroidRuntime(632): Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
08-16 15:18:00.122: E/AndroidRuntime(632):  at android.app.ContextImpl.startActivity(ContextImpl.java:621)
08-16 15:18:00.122: E/AndroidRuntime(632):  at android.content.ContextWrapper.startActivity(ContextWrapper.java:258)
08-16 15:18:00.122: E/AndroidRuntime(632):  at com.demo.EmailService.sendEmail(EmailService.java:86)
08-16 15:18:00.122: E/AndroidRuntime(632):  at com.demo.EmailService.onStartCommand(EmailService.java:44)
08-16 15:18:00.122: E/AndroidRuntime(632):  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2039)

Here is my Service Code

public class EmailService extends Service 
{
    private static final String TAG = null;
    private static final String TAG1="MyService";
    private static final String LOGTAG = null;


    String strServiceName ;
    String strSuppliername ;
    String strEmail; 
    String strReplacementDate ; 
    String strIntervalDays; 
    String strNextReplacementDate;

    String strMyServicePref;

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    public void onCreate()
    {
         Toast.makeText(this,"My Service Created",Toast.LENGTH_LONG).show();
         Log.d(TAG,"ON CREATE");
         super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        startService(intent);
        sendEmail();
        return Service.START_STICKY;
    }


    protected void sendEmail()
    {
         SharedPreferences sharedPref1 =getSharedPreferences("MyPref_CellNumber", 0);
         SharedPreferences.Editor editor1 = sharedPref1.edit();

         strServiceName=sharedPref1.getString("ServiceName" , "a\n");
         strSuppliername=sharedPref1.getString("Suppliername" , "a\n");
         strEmail=sharedPref1.getString("Email" , "a\n");
         strReplacementDate=sharedPref1.getString("ReplacementDate" , "a\n");
         strIntervalDays=sharedPref1.getString("IntervalDays" , "a\n");
         strNextReplacementDate=sharedPref1.getString("NextReplacementDate" , "a\n");

         Log.e(TAG,"ON CREATE" + strServiceName);
         Log.e(TAG,"ON CREATE" + strSuppliername);
         Log.e(TAG,"ON CREATE" + strEmail);
         Log.e(TAG,"ON CREATE" + strReplacementDate);
         Log.e(TAG,"ON CREATE" + strIntervalDays);
         Log.e(TAG,"ON CREATE" + strNextReplacementDate);

                            String subject = strServiceName;

                            String body = strServiceName+","
                                          +strSuppliername+","
                                          +strReplacementDate+","
                                          +strIntervalDays+","
                                          +strNextReplacementDate;

                           Log.e("body " , " = " + body);

                          Intent i = new Intent(Intent.ACTION_SEND);
                          i.setType("message/rfc822");
                          i.putExtra(Intent.EXTRA_EMAIL  , new String[]{strEmail});
                          i.putExtra(Intent.EXTRA_SUBJECT, subject);
                          i.putExtra(Intent.EXTRA_TEXT   , body);

                          try 
                          {
                              startActivity(Intent.createChooser(i, "Send mail...in Service Background"));
                          } 
                          catch (android.content.ActivityNotFoundException ex) 
                          {
                              Toast.makeText(EmailService.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
                          }
         }
}

Upvotes: 0

Views: 90

Answers (1)

mesh
mesh

Reputation: 937

I think you should use Alarm Manager.

The Alarm Manager is intended for cases where you want to have your application code run at a specific time, even if your application is not currently running.

Upvotes: 1

Related Questions