适用于Android的未绑定复制服务

时间:2014-12-07 03:22:11

标签: java android service nullpointerexception android-service

好的,所以我正在开发一个Android程序,它会列出您在历史记录中复制的内容。我以前有一个活动这样做,但我希望它工作,即使活动没有在后台运行,所以我正在处理服务以获取用户复制的数据,并调用活动方法在应用程序中处理和列出它。这是我的服务:

public class Operation extends Service {

private static int NOTIFY_ID = 1;
ClipData.Item item;
String newText;
ClipboardManager clipboard;
Context context = this;
ArrayList<String> operationVals = new ArrayList<String>();


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


@Override
public void onCreate() {

    NotificationCompat.Builder tasker =
            new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.appicon)
                    .setContentTitle("Copy Data Recorder")
                    .setOngoing(true)
                    .setContentText("Recording copied data");


    Intent copyAction = new Intent(this, MainActivity.class);
    PendingIntent pendAction = PendingIntent.getActivity(this, 0, copyAction, 0);

    tasker.setContentIntent(pendAction);

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(NOTIFY_ID, tasker.build());

}

@Override
public void onStart(Intent intent, int startId) {}

@Override
public void onDestroy() {}

@Override
public int onStartCommand(Intent intent, int flags, int startId){

    clipboard = (ClipboardManager)
            getSystemService(Context.CLIPBOARD_SERVICE);


     clipboard.addPrimaryClipChangedListener(new OnPrimaryClipChangedListener() { 


        public void onPrimaryClipChanged() {

            ClipData clip = clipboard.getPrimaryClip(); 

            try {

                item = clip.getItemAt(0);

            } catch (Exception e) {


            }

            newText = item.coerceToText(context).toString();
            operationVals.add(newText);

            try { 


                MainActivity messager = new MainActivity();

                messager.doIt(operationVals); 

            } catch (Exception e) {

                System.out.println("Exception Error: " + e);
            }


        }

    });

    return START_STICKY;
}

}

基本上,每次,它都会获得复制的内容,将其添加到String数组列表&#34; operationVals&#34;,并调用主要活动的方法doIt()。 doIt()循环遍历数组,检查哪些复制数据是新的,并将其添加到名为&#34; ets&#34;的EditText对象的数组列表中。打开应用程序活动时显示的内容。这是:

public void doIt(ArrayList values){

    for (String element : values) {

        if (ets.size() != 0) {

            for (int i = 0; i < ets.size(); i++) {

                String element2 = ets.get(i).getText().toString();

                if (element2.equals(element)) {

                    values.remove(i);

                }
            }
        }

    }

    if (values.size() != 0) {

        for (String newText : values) {


            /* If the size is zero and we currently have no items, this one should
               be immediately added.*/

            if (ets.size() == 0) {

                ets.add(new EditText(context)); //Adds EditText field
                ets.get(ets.size() - 1).setText(newText); //Sets newText string in EditText that was created
                linearlayout.addView(ets.get(ets.size() - 1)); //Adds element to view
                contentSpace.add(ets.get(ets.size() - 1).getText().toString());

            } else if (ets.size() != 0) {

                oldText = ets.get(ets.size() - 1).getText().toString();

                // Checks that new copied data is different from previous data and does not contain only spaces
                if (!newText.equals(oldText) && newText.trim().length() > 0 && oldText.trim().length() > 0) {

                    ets.add(new EditText(context)); //Adds EditText field
                    ets.get(ets.size() - 1).setText(newText); //Sets newText string in EditText that was created
                    linearlayout.addView(ets.get(ets.size() - 1)); //Adds element to view
                    contentSpace.add(ets.get(ets.size() - 1).getText().toString());

                } else if (oldText.trim().length() == 0) {

                    for (int i = 0; i < ets.size(); i++) {

                        if (ets.get(i).getText().toString().equals(oldText)) {

                            oldText = oldText.trim();
                            ets.get(ets.size() - 1).setText(newText);

                        }
                    }
                } else {

                }

            }

        }

    }

}

然而,我测试了它,在我的服务调用doIt()并且程序开始检查ets并向其添加元素之前,事情似乎正常。我得到一个NullPointerException。似乎ets已被正确声明和初始化,并且我的活动显然已经创建(服务在主要活动的onStart()中启动)。如果有人能帮我解决这个问题,我将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

代码中存在多个问题:

  • 您不能像这样实例化一个Activity:MainActivity messager = new MainActivity(); 只能使用Intents(Intent.startActivity系列方法)启动(或激活)活动。

  • 您应该使用BroadcastReceiver或Messenger来处理服务和活动之间的通信。

  • 考虑将数据发送到活动但是活动处于后台并处于停止状态的情况(当活动处于后台时将调用Activity.onPause和Activity.onStop)。在这种情况下,您可以再次调用Intent.startActivity,但设置了标志FLAG_ACTIVITY_REORDER_TO_FRONT,这将导致活动被置于前台(如果已经存在,则不会重新创建活动的新实例)

  • 考虑将您在Service.onStartCommand中设置的逻辑移动到Service.onCreate,因为每次调用Context.startService方法时都会调用Service.onStartCommand,每次都会覆盖以前的设置。