Status:
Really thankful to all who helped and guided here and in part-1! I have made code out of research and help given and have put that working code in EDIT-1. Criticisms are welcomed to make the code better.
Scenario:
I asked the question mention in Part-1, but for some reason I can persistently cannot make a design and correct strategy with code that has true integration and sanity.
It was a lengthy question and the question nor answer could have been concluded or finalized in just one episode, so I have made this second part as a synopsis.
May be I am incompetent or just disturbed reading so much scatered documentations and answers of different strategies, or answers are of different views/coding styles.
Part-1 part-1 persistent foreGround android service that starts by UI, works at sleep mode too, also starts at phone restart
Question:
Heres what I wanted and had finally concluded after observing different answers:
Need to run code every 15 minuts (even when phone is at sleep). Would need wake locks I think?
//AT boot, check shared preferences to see boolean "serviceEnabled"?
//if true, set alarm manager to run a service every 15 minuts.
//if false, do nothing.
//On "enable" button clicked.
//make "serviceEnabled" boolean true in shared preferences.
//start alarm manager to run a service every 15 minuts.
//on "Disable" button clicked.
//make "serviceEnabled" boolean false in shared preferences.
//stop alarm manager and deregister it to run ever.
Can any one comprehensively tell... what code should I use...? I am humbly thanks full with a headache of research.
Requests:
Please only answer if you confidently and with experience know what you are doing.
EDIT-1-Start:
Here's what I have made so far. Please feel free to comment or criticize.
Booter class that runs on boot.
public class Booter extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
Log.e("boot-status","BOOT_COMPLETED=================================================");
// SharedPreferences prefs = context.getSharedPreferences("$MYPACKAGE_preferences",0);
// if (prefs.getBoolean("startatboot",false)) {
if(true){
Intent updateIntent = new Intent();
updateIntent.setClass(context, TheService.class);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, updateIntent, 0);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, java.lang.System.currentTimeMillis()+5000,5000, pendingIntent);
}
}
}
}
The service class
public class TheService extends Service{
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
PowerManager pm;
PowerManager.WakeLock wl;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
wl.acquire();
startForeground(1, new Notification());
////// will do all my stuff here on in the method onStart() or onCreat()?
Log.e("app-status","ping ====================================================");
new Thread(new Runnable() {
@Override
public void run() {
wl.release();
stopSelf();
}
}).start();
return START_STICKY;
}
@Override
public void onDestroy() {
stop();
}
public void stop(){
//if running
// stop
// make vars as false
// do some stopping stuff
stopForeground(true);
}
}
GUI to start / stop
public class SettingsActivity extends Activity {
// some code to initialize things
buttonStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent updateIntent = new Intent();
updateIntent.setClass(SettingsActivity.this, TheService.class);
PendingIntent pendingIntent = PendingIntent.getService(SettingsActivity.this, 0, updateIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager)SettingsActivity.this.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
//make sharepred boolean as false
}
});
buttonStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent updateIntent = new Intent();
updateIntent.setClass(SettingsActivity.this, TheService.class);
PendingIntent pendingIntent = PendingIntent.getService(SettingsActivity.this, 0, updateIntent, 0);
AlarmManager alarmManager = (AlarmManager)SettingsActivity.this.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, java.lang.System.currentTimeMillis()+5000,5000, pendingIntent);
//make shared prefs boolean as true
}
});
Menifiest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> // irrelevent here
<uses-permission android:name="android.permission.INTERNET" /> // my app uses these though in service class.
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
android:allowBackup="true"
android:debuggable="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.myapp.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.myapp.SettingsActivity"
android:label="@string/title_activity_settings" >
</activity>
<service android:name=".TheService" />
<receiver android:name=".Booter" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
</application>
</manifest>
EDIT-1-END.