好的,所以我正在开发一个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()中启动)。如果有人能帮我解决这个问题,我将不胜感激。谢谢。
答案 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,每次都会覆盖以前的设置。