2016-04-20 352 views
0

我已经在我的应用程序中创建了一个服务,并调用了使用onClick在xml中按钮启动服务的函数,但应用程序崩溃。 一些帮助将不胜感激。 package slide.apptech.com.nav;无法启动服务错误android

import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.support.annotation.Nullable; 
import android.view.View; 
import android.support.design.widget.NavigationView; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.support.design.widget.FloatingActionButton; 

import java.util.ArrayList; 
import java.util.Calendar; 

import static java.util.Calendar.*; 

public class MainActivity extends AppCompatActivity 
    implements NavigationView.OnNavigationItemSelectedListener { 

private static String TAG = MainActivity.class.getSimpleName(); 
private Intent myIntent; 
Button Refresh; 
TextView updated; 

//related to main screen list view 
ListView lv; 
Context context; 
ArrayList prgmName; 
public static int [] prgmImages={R.drawable.temp,R.drawable.hum,R.drawable.press,R.drawable.amb,R.drawable.alt}; 
public static String [] prgmNameList={" Temperature: "," Humidity: "," Pressure: "," Ambient Light:"," Altitude: "}; 
//GetFromServer gs1=new GetFromServer(); 
public String [] prgmVal={"1","2","3","4","5"}; 
public static String [] prgmUnit={" °C"," %"," hPa"," lx"," m"}; 
//public String datentime=gs1.DateNTime[0]; 
String datentime; 

//boolean variable to indicate if the arrays have been set or not 
Boolean arraysset; 
GetFromServer gs1; 
public ArrayList<String> atList=new ArrayList<String>(); 
public ArrayList<String> dataList=new ArrayList<String>(); 


@Override 
protected void onCreate(Bundle savedInstanceState) { 

    //these lines overite all the warnings by android to restrict large tasks 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    lv = (ListView) findViewById(R.id.listView); 
    updated=(TextView)findViewById((R.id.datentime)); 
    Refresh = (Button) findViewById(R.id.refresh); 

    //block related to main screen list view 
    //creating a object from getfromserver class to give a request to server 
    gs1=new GetFromServer(); 
    new loadSomeStuff().execute(); 
    updated.setText(datentime); 

    prgmVal[0]=Double.toString(gs1.Temperature[0]); 
    prgmVal[1]=Double.toString(gs1.Humidity[0]); 
    prgmVal[2]=Double.toString(gs1.Pressure[0]); 
    prgmVal[3]=Double.toString(gs1.Ambient[0]); 
    prgmVal[4]=Double.toString(gs1.Altitude[0]); 
    datentime="Updated on :"+gs1.DateNTime[0]; 
    context = this; 

    //this adapter is defined in custom adapter 
    // see class for all the constructors 
    lv.setAdapter(new CustomAdapter(MainActivity.this, MainActivity.prgmNameList, MainActivity.prgmImages, prgmVal, MainActivity.prgmUnit)); 

    //code related to refresh button the main screen find xml in content_main 
    Refresh.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      startService(new Intent(getBaseContext(),service.class)); 
      //Toast.makeText(context, "Please wait!", Toast.LENGTH_LONG).show(); 
      gs1 = new GetFromServer(); 
      gs1.sendData(); 
      gs1.setArray(); 

      //codeline to start athe service 


      prgmVal[0] = Double.toString(gs1.Temperature[0]); 
      prgmVal[1] = Double.toString(gs1.Humidity[0]); 
      prgmVal[2] = Double.toString(gs1.Pressure[0]); 
      prgmVal[3] = Double.toString(gs1.Ambient[0]); 
      prgmVal[4] = Double.toString(gs1.Altitude[0]); 
      String datentime = "Updated on :" + gs1.DateNTime[0]; 
      updated.setText(datentime); 
      context = MainActivity.this; 
      lv.setAdapter(new CustomAdapter(MainActivity.this, MainActivity.prgmNameList, MainActivity.prgmImages, prgmVal, MainActivity.prgmUnit)); 
      //Toast.makeText(context, "Refreshed!!!", Toast.LENGTH_LONG).show(); 
     } 
    }); 


    //this code is for a floation button see xml 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent myIntent = new Intent(MainActivity.this,Faq.class); 
      startActivity(myIntent); 
     } 
    }); 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 
} 

//this is code related to back button in action bar to close drawer if open else go back to previous activity 
@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     super.onBackPressed(); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

//app crash due to following code 
@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    int id = item.getItemId(); 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (id == R.id.liConnection) { 
     drawer.closeDrawer(GravityCompat.START); 
     Intent myIntent = new Intent(MainActivity.this, Connect.class); 
     startActivity(myIntent); 
    } 
    else if (id == R.id.liRanges){ 
     drawer.closeDrawer(GravityCompat.START); 
     Intent myIntent = new Intent(MainActivity.this, Ranges.class); 
     startActivity(myIntent); 
    } 
    else if (id == R.id.liSupport) { 
     drawer.closeDrawer(GravityCompat.START); 
     Intent myIntent = new Intent(MainActivity.this, Support.class); 
     startActivity(myIntent); 
    } 
    else if (id == R.id.liAbout) { 
     drawer.closeDrawer(GravityCompat.START); 
     Intent myIntent = new Intent(MainActivity.this, AboutUs.class); 
     startActivity(myIntent); 
    } 
    else if (id == R.id.liRateus) { 
     drawer.closeDrawer(GravityCompat.START); 
     Intent myIntent = new Intent(MainActivity.this,Rateus.class); 
     startActivity(myIntent); 
    } 
    return true; 
} 


public void getPosition(int position) { 
    if (position == 0) { 
     //code specific to first list item 
     myIntent = new Intent(MainActivity.this, ChartTemperature.class); //replace connect classs with analysis 
     startActivity(myIntent); 
    } 
    else if (position == 1) { 
     //code specific to first list item 
     Intent myIntent = new Intent(MainActivity.this, ChartHumidity.class); 
     startActivity(myIntent); 
    } 
    else if (position == 2) { 
     //code specific to first list item 
     Intent myIntent = new Intent(MainActivity.this, ChartPressure.class); 
     startActivity(myIntent); 
    } 
    else if (position == 3) { 
     //code specific to first list item 
     Intent myIntent = new Intent(MainActivity.this, ChartAmbient.class); 
     startActivity(myIntent); 
    } 
    else if (position == 4) { 
     //code specific to first list item 
     Intent myIntent = new Intent(MainActivity.this, ChartAltitude.class); 
     startActivity(myIntent); 
    } 
} 

// Method to start the service 
public void startService(View view) { 
    startService(new Intent(getBaseContext(), service.class)); 
} 

//here we are creating a async task to reduce load on oncreate method 
public class loadSomeStuff extends AsyncTask<String, Integer, Void> { 

    @Override 
    protected Void doInBackground(String... params) { 
     // TODO Auto-generated method stub 


      try { 
       gs1.sendData(); 
       gs1.setArray(); 
       prgmVal[0]=Double.toString(gs1.Temperature[0]); 
       prgmVal[1]=Double.toString(gs1.Humidity[0]); 
       prgmVal[2]=Double.toString(gs1.Pressure[0]); 
       prgmVal[3]=Double.toString(gs1.Ambient[0]); 
       prgmVal[4]=Double.toString(gs1.Altitude[0]); 
       datentime="Updated on :"+gs1.DateNTime[0]; 

       arraysset = true; 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     return null; 
    } 
} 

}

service.java

package slide.apptech.com.nav; 

import android.app.Notification; 
import android.app.NotificationManager; 
import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.os.IBinder; 
import android.support.annotation.Nullable; 
import android.widget.Toast; 

/** 
* Created by MOHIT on 17-04-2016. 
*/ 
public class service extends Service{ 
    //creating a server class object 
    GetFromServer gs1; 

    //creating a database object 
    database record; 
    String value; 
    boolean tempflag,pressflag,humflag,lightflag; 
    double temperature,humidity,pressure,light,max,min; 
    NotificationManager manager; 
    Notification myNotication; 
    Context context; 
    MainActivity main; 
    public final String UPDATE_DATA = "update"; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     //Toast.makeText(context, "Service Started in onStartCommand", Toast.LENGTH_LONG).show(); 
     if(intent.getAction().equals(UPDATE_DATA)){ 
      Toast.makeText(context, "Service Started in onStartCommand", Toast.LENGTH_LONG).show(); 
      //getandcheck(); 
     } 
     return START_STICKY; 
    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    public void getandcheck(){ 

     //getting the values from server 
     gs1 = new GetFromServer(); 
     gs1.sendData(); 
     gs1.setArray(); 
     //setting variables to latest sensor values 
     temperature = gs1.Temperature[0]; 
     humidity = gs1.Humidity[0]; 
     pressure = gs1.Pressure[0]; 
     light = gs1.Ambient[0]; 

     record.open(); 

     //making function calls to setup flags 
     checktemp(); 
     checkhum(); 
     checkpress(); 
     checklight(); 

     //if any flag is true the it means that readings are out of range 
     if(tempflag == true){ 

      String readings = ("Temperature : " + temperature +" °C"); 


      final Notification.Builder builder = new Notification.Builder(service.this); 
      builder.setStyle(new Notification.BigTextStyle(builder) 
        .bigText(readings) 
        .setBigContentTitle("WSstation") 
        .setSummaryText("Alert!!!")) 
        .setContentTitle("WSstation") 
        .setContentText("Your Temperature Readings are out of range") 
        .setSmallIcon(R.drawable.auicon); 

      final NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
      nm.notify(0, builder.build()); 
     } 

     if(pressflag == true){ 

      String readings = ("Pressure : " + pressure +" hpa"); 


      final Notification.Builder builder = new Notification.Builder(service.this); 
      builder.setStyle(new Notification.BigTextStyle(builder) 
        .bigText(readings) 
        .setBigContentTitle("WSstation") 
        .setSummaryText("Alert!!!")) 
        .setContentTitle("WSstation") 
        .setContentText("Your Pressure Readings are out of range") 
        .setSmallIcon(R.drawable.auicon); 

      final NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
      nm.notify(0, builder.build()); 
     } 

     if(humflag == true){ 

      String readings = ("Humidity : " + humidity +" %"); 


      final Notification.Builder builder = new Notification.Builder(service.this); 
      builder.setStyle(new Notification.BigTextStyle(builder) 
        .bigText(readings) 
        .setBigContentTitle("WSstation") 
        .setSummaryText("Alert!!!")) 
        .setContentTitle("WSstation") 
        .setContentText("Your Humidity Readings are out of range") 
        .setSmallIcon(R.drawable.auicon); 

      final NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
      nm.notify(0, builder.build()); 
     } 

     if(lightflag == true){ 

      String readings = ("Ambient Light : " + light +" lx"); 


      final Notification.Builder builder = new Notification.Builder(service.this); 
      builder.setStyle(new Notification.BigTextStyle(builder) 
        .bigText(readings) 
        .setBigContentTitle("WSstation") 
        .setSummaryText("Alert!!!")) 
        .setContentTitle("WSstation") 
        .setContentText("Your Ambient Light Readings are out of range") 
        .setSmallIcon(R.drawable.auicon); 

      final NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
      nm.notify(0, builder.build()); 
     } 
    } 

    public void checktemp(){ 
     //for temperature checking 
     value = record.getMax(1); 
     max = Double.parseDouble(value); 
     value = record.getMin(1); 
     min = Double.parseDouble(value); 

     if((temperature < min) || (temperature > max)){ 
      tempflag = true; 
     } 
     else{ 
      tempflag = false; 
     } 
    } 

    public void checkhum(){ 
     //for humidity checking 
     value = record.getMax(3); 
     max = Double.parseDouble(value); 
     value = record.getMin(3); 
     min = Double.parseDouble(value); 

     if((humidity < min) || (humidity > max)){ 
      humflag = true; 
     } 
     else{ 
      humflag = false; 
     } 
    } 

    public void checkpress(){ 
     //for pressure checking 
     value = record.getMax(2); 
     max = Double.parseDouble(value); 
     value = record.getMin(2); 
     min = Double.parseDouble(value); 

     if((pressure < min) || (pressure > max)){ 
      pressflag = true; 
     } 
     else{ 
      pressflag = false; 
     } 
    } 

    public void checklight(){ 
     //for ambient light checking 
     value = record.getMax(4); 
     max = Double.parseDouble(value); 
     value = record.getMin(4); 
     min = Double.parseDouble(value); 

     if((light < min) || (light > max)){ 
      lightflag = true; 
     } 
     else{ 
      lightflag = false; 
     } 
    } 

    /*@Override 
    public void onCreate() { 
     super.onCreate(); 
     Toast.makeText(context, "Service Started in oncreate", Toast.LENGTH_LONG).show(); 
    }*/ 

} 

content_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context="slide.apptech.com.nav.MainActivity" 
    tools:showIn="@layout/app_bar_main"> 

    <RelativeLayout 
     android:id="@+id/mainContent" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#004D40"> 



     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:background="#004D40" 
      android:layout_width="match_parent" 
      android:layout_height="fill_parent" 
      android:orientation="vertical" 
      android:paddingBottom="@dimen/activity_vertical_margin" 
      android:paddingLeft="@dimen/activity_horizontal_margin" 
      android:paddingRight="@dimen/activity_horizontal_margin" 
      android:paddingTop="@dimen/activity_vertical_margin" 
      tools:context=".Home" 
      android:layout_alignParentTop="true" 
      android:layout_alignParentStart="true"> 

      <!--<TextView 
       android:id="@+id/textView1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textSize="25dp" 
       android:textStyle="bold" 
       android:text=" Computer Languages..." /> 
       --> 

      <ListView 
       android:paddingTop="60dp" 
       android:id="@+id/listView" 
       android:layout_width="fill_parent" 
       android:layout_height="376dp" 
       android:layout_above="@+id/datentime"> 
      </ListView> 

      <TextView 
       android:paddingTop="20dp" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textAppearance="?android:attr/textAppearanceSmall" 
       android:text="Updated:" 
       android:textColor="#FFEB3B" 
       android:id="@+id/datentime" 
       android:layout_gravity="center_horizontal" /> 

      <Button 
       style="?android:attr/buttonStyleSmall" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Refresh" 
       android:id="@+id/refresh" 
       android:layout_gravity="center_horizontal" 
       android:onClick="startService"/> 


     </LinearLayout> 

    </RelativeLayout> 

</RelativeLayout> 

logcat的

04-20 20:15:18.623 27500-27500/slide.apptech.com.nav E/MotionRecognitionManager: mSContextService = null 
04-20 20:15:18.628 27500-27500/slide.apptech.com.nav E/MotionRecognitionManager: motionService = [email protected]28c858d 
04-20 20:15:24.578 27500-27500/slide.apptech.com.nav E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: slide.apptech.com.nav, PID: 27500 
                     java.lang.RuntimeException: Unable to start service [email protected] with Intent { cmp=slide.apptech.com.nav/.service }: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference 
                      at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3978) 
                      at android.app.ActivityThread.access$2300(ActivityThread.java:211) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1803) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:145) 
                      at android.app.ActivityThread.main(ActivityThread.java:6912) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 
                     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference 
                      at slide.apptech.com.nav.service.onStartCommand(service.java:33) 
                      at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3961) 
                      at android.app.ActivityThread.access$2300(ActivityThread.java:211)  
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1803)  
                      at android.os.Handler.dispatchMessage(Handler.java:102)  
                      at android.os.Looper.loop(Looper.java:145)  
                      at android.app.ActivityThread.main(ActivityThread.java:6912)  
                      at java.lang.reflect.Method.invoke(Native Method)  
                      at java.lang.reflect.Method.invoke(Method.java:372)  
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)  
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)  

回答

0

您在service.onStartCommand检查的意图没有任何操作。改变这种

if(intent.getAction().equals(UPDATE_DATA)){ 
    Toast.makeText(context, "Service Started in onStartCommand", Toast.LENGTH_LONG).show(); 
    //getandcheck(); 
} 

这个

if(intent.getAction() != null && intent.getAction().equals(UPDATE_DATA)){ 
    Toast.makeText(context, "Service Started in onStartCommand", Toast.LENGTH_LONG).show(); 
    //getandcheck(); 
} 

UPDATE
要仍显示敬酒,你可以把你的意图额外的布尔并检查这您服务。启动你的服务这样

startService(new Intent(getBaseContext(),service.class).putExtra("show_toast", true)); 

而且在服务检查它像这样

if (intent.getBooleanExtra("show_toast", false)) { 
    Toast.makeText(context, "Service Started in onStartCommand", Toast.LENGTH_LONG).show(); 
    //getandcheck(); 
} 
+0

我刚刚编辑我的代码,现在应用程序不crash.thanks.but我没有得到吐司消息你能建议我的东西。为什么if块没有被执行,我如何编辑代码来执行它。 – M2skills

+0

你不为你的意图提供一个动作,这就是为什么你的吐司没有显示。你可以额外加入你的意图。我会更新我的答案 – 0xDEADC0DE

0

看起来你没有指定意图的行动,你所得到的,因为一个空指针。 另外请确保您检查字符串常量与对象值以避免空指针异常。

UPDATE_DATA.equals(intent.getAction())