服务调用中的片段空指针异常

时间:2014-07-25 14:38:05

标签: android

在抽屉导航中,当我选择启动服务选项时,应用程序崩溃并且logcat显示空指针异常我还没有提到我定义的所有变量。

MainActivity.class

public class MainActivity extends Activity{

    private void displayView(int position) {
        // update the main content by replacing fragments
        ActionBar actionbar12 = getActionBar();
        Fragment fragment = null;


        switch (position) {
        case 0:
            actionbar12.setNavigationMode(0);
            fragment = new BlacklistFragment();


            break;
        case 1:
        {


            actionbar12.setNavigationMode(0);
            fragment = new BlacklistFragment();
            startCallBlockerService()


        }
            break;
        case 2:
            actionbar12.setNavigationMode(0);
            fragment = new PhotosFragment();
            break;
        case 3:
            actionbar12.setNavigationMode(0);
            fragment = new CommunityFragment();
            break;
        case 4:
            actionbar12.setNavigationMode(0);
            fragment = new PagesFragment();
            break;
        case 5:
            if(wer==0)
            {
                ActionBar.Tab ce = actionbar12.newTab().setText("Yo");
                ActionBar.Tab ce1 = actionbar12.newTab().setText("Yo2");

                fragment = new HomeFragment();
                Fragment fragment1=new FindPeopleFragment();

                ce.setTabListener(new MyTabsListener(fragment));
                ce1.setTabListener(new MyTabsListener(fragment1));
                actionbar12.addTab(ce);
                actionbar12.addTab(ce1);
                wer++;
            }
            actionbar12.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
            fragment = new WhatsHotFragment();
            break;

        case 6:
            actionbar12.setNavigationMode(0);
            fragment = new WhatsHotFragment();
            break;

        case 7:
            actionbar12.setNavigationMode(0);
            fragment = new WhatsHotFragment();
            break;

        case 8:
            actionbar12.setNavigationMode(0);
            fragment = new WhatsHotFragment();
            break;

        default:
            break;
        }

        if (fragment != null) {
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.frame_container, fragment).commit();

            // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
            setTitle(navMenuTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            // error in creating fragment
            Log.e("MainActivity", "Error in creating fragment");
        }
    }

    public void startCallBlockerService()
    {
        if(!checkIfServiceIsAlreadyRunning())
        {
            if(blackList.size()>0)
            {
                Intent i=new Intent(MainActivity.this, CallBlockerService.class);
                startService(i);
            }
            else
            {
                CallBlockerToastNotification.showDefaultShortNotification("Blacklist is empty, service can't start");
            }
        }
        else
        {
            CallBlockerToastNotification.showDefaultShortNotification("Service is running already");
        }
    }

    public void stopCallBlockerService()
    {
        if(checkIfServiceIsAlreadyRunning())
        {
            stopService(new Intent(MainActivity.this, CallBlockerService.class));
        }
    }

    public static boolean checkIfServiceIsAlreadyRunning()
    {
        for(RunningServiceInfo service: manager.getRunningServices(Integer.MAX_VALUE))
        {
            if(CallBlockerService.class.getName().equals(service.service.getClassName()))
            {
                return true;
            }
        }
        return false;
    }

    public void loadData()
    {
        try
        {
            FileInputStream fis=openFileInput("CallBlocker.data");
            ObjectInputStream objeto=new ObjectInputStream(fis);
            blackList=(HashMap<String, BlockedContact>)objeto.readObject();
            fis.close();
            objeto.close();
        }
        catch (Exception e) 
        {
            blackList=new HashMap<String, BlockedContact>();
            Log.e("Error", e.getMessage());
        }  
    }

    public void saveData()
    {
        try 
        {
            FileOutputStream fos=openFileOutput("CallBlocker.data", Context.MODE_PRIVATE);
            ObjectOutputStream oos=new ObjectOutputStream(fos);
            oos.writeObject(blackList);
            fos.close();
            oos.close();
            CallBlockerToastNotification.showDefaultShortNotification("Saving Data...");
        } 
        catch (Exception e)
        {
            Log.e("Error", e.getMessage());
        } 
    }


}


CallBlockerService.class

public class CallBlockerService extends Service
{

    public static final int notification_id = 111;

    //---------------------------------------
    //Listening Services
    //---------------------------------------
    private static ServiceReciever service;
    private static SmsReceiver sms;

    //---------------------------------------
    //Data Structures
    //---------------------------------------
    public static HashMap<String, BlockedContact>blackList;


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

    @Override
    public void onCreate() 
    {
        loadData();
        service=new ServiceReciever(getApplicationContext());
        sms=new SmsReceiver();
        registerReceiver(service, new IntentFilter("android.intent.action.PHONE_STATE"));
        registerReceiver(sms, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));
        showStatusBarNotification("Call blocker is running now");
    }

    @Override
    public void onDestroy() 
    {
        CallBlockerToastNotification.showDefaultShortNotification("Turning call blocker off");
        service.stopListening(); 
        unregisterReceiver(service);
        unregisterReceiver(sms);
        service=null;
        sms=null;
        cancelStatusBarNotification();
        super.onDestroy();
    }

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

    public void showStatusBarNotification(String message)
    {
        NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);

        Intent i=new Intent(CallBlockerService.this, CallBlockerMainActivity.class);
        PendingIntent pi=PendingIntent.getActivity(this, 0, i, 0);

        Notification noti =new NotificationCompat.Builder(this)
        .setContentTitle("Call blocker notification")
        .setWhen(System.currentTimeMillis())
        .setContentText(message).setSmallIcon(R.drawable.running_not_icon)
        .setContentIntent(pi).build();

        noti.flags |= Notification.FLAG_NO_CLEAR;

        manager.notify(notification_id,noti);
    }

    public void cancelStatusBarNotification()
    {
        NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        manager.cancel(notification_id);
    }

    public void loadData()
    {
        try
        {
            FileInputStream fis=openFileInput("CallBlocker.data");
            ObjectInputStream objeto=new ObjectInputStream(fis);
            blackList=(HashMap<String, BlockedContact>)objeto.readObject();
            fis.close();
            objeto.close();
        }
        catch (Exception e) 
        {
            blackList=new HashMap<String, BlockedContact>();
            Log.e("Error", e.getMessage());
        } 
    }

}

logcat的:

07-25 19:49:04.806: E/AndroidRuntime(2365): FATAL EXCEPTION: main
07-25 19:49:04.806: E/AndroidRuntime(2365): java.lang.RuntimeException: Unable to start activity ComponentInfo{info.androidhive.slidingmenu/info.androidhive.slidingmenu.MainActivity}: java.lang.NullPointerException
07-25 19:49:04.806: E/AndroidRuntime(2365):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2306)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at android.app.ActivityThread.access$600(ActivityThread.java:156)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1340)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at android.os.Looper.loop(Looper.java:153)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at android.app.ActivityThread.main(ActivityThread.java:5297)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at java.lang.reflect.Method.invokeNative(Native Method)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at java.lang.reflect.Method.invoke(Method.java:511)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:133)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at dalvik.system.NativeStart.main(Native Method)
07-25 19:49:04.806: E/AndroidRuntime(2365): Caused by: java.lang.NullPointerException
07-25 19:49:04.806: E/AndroidRuntime(2365):     at info.androidhive.slidingmenu.MainActivity.checkIfServiceIsAlreadyRunning(MainActivity.java:383)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at info.androidhive.slidingmenu.MainActivity.startCallBlockerService(MainActivity.java:355)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at info.androidhive.slidingmenu.MainActivity.onCreate(MainActivity.java:119)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at android.app.Activity.performCreate(Activity.java:5122)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081)
07-25 19:49:04.806: E/AndroidRuntime(2365):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270)
07-25 19:49:04.806: E/AndroidRuntime(2365):     ... 12 more

1 个答案:

答案 0 :(得分:0)

在致电manager.getRunningServices之前,请执行以下操作:

if (manager == null) {
    manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
}