Hey I am trying to make an application that tells me when the battery is full when the phone is connected to power. I made a service and used a broadcast receiver in that to check the battery status. Whenever i connect or disconnect the phone from the power, my app crashes. The service still runs and i get the notification when battery is full.
I dont know why is the app crashing again and again. Here is my code
public class Srvc extends Service{
@Override
public int onStartCommand(Intent intent, int flags, int startId){
// TODO Auto-generated method stub
final IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
this.registerReceiver(this.br, ifilter);
System.out.println("started the service");
return super.onStartCommand(intent,flags,startId);
}
public final BroadcastReceiver br = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("inside on recieve");
chckbttry(intent);
}
};
private void chckbttry(Intent intent) {
// TODO Auto-generated method stub
System.out.println("inside chckbttry method");
final int currLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
final int maxLevel = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharged = status == BatteryManager.BATTERY_STATUS_FULL;
final int percentage = (int) Math.round((currLevel * 100.0) / maxLevel);
if (status == BatteryManager.BATTERY_STATUS_CHARGING)
{
System.out.println("calling the BrdCst_strt");
if (percentage == 100 || isCharged==true) {
System.out.println("bttry fully chrged");
Intent i = new Intent(getBaseContext(),PlayMus.class); //call another activity
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("msg", "Battery fully charged");
getApplication().startActivity(i);
}
else
{
System.out.println("not yet charged");
Intent i = new Intent(getBaseContext(), Test.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("msg", "Battery not fully charged");
getApplication().startActivity(i);
}
}
if (status == BatteryManager.BATTERY_STATUS_DISCHARGING)
{
System.out.println("unregistering the service");
unregisterReceiver(br);
}
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
System.out.println("service stopped");
unregisterReceiver(br);
super.onDestroy();
}
}
Please help me.
Thanks.
Write your code as a service. Its simple to use
also add it on manifest
/////////////////// New Codes ///////////////////
}
//////////////// Another One ///////////////////
In your manifest
In your activity
System messages like the battery level are sent as a Broadcast through the whole system. You can receive them with a so called BroadcastReceiver.
While Activities have an UI, you need to use a Service. They are meant to be used for doing longer work in the background while your App is not visible. Your App has to be started at least once to start this Service out of an Activity. Some additional information for you: There are also AsyncTasks. Those are meant to be used for stuff while your App is visible and working (like loading data from the Internet into a ListView or something). You have to Tasks, because your UI will freeze if you do not do so. Almost Everything you program without using Tasks, will be executed in the UI Thread. If the UI Thread gets busy, the user will not be able to do anything.
Now here some code:
MainActivity.java
MyService.java
Manifest.xml: You need an entry for your Serivice - just like for an Activity.
Please let me know if you have any more questions!
Best regards Vincent