java安卓:如何从服务调用方法
我正在制作一个应用程序,它可以从手机中读取短信,并将特定发件人的短信发送到服务器。我想应用程序运行在后台使用服务,但它不工作。当我尝试启动服务时,应用程序正在崩溃
(如果我使用Mediaplayer播放一些音乐,该服务工作正常,但我认为当我尝试在服务启动时运行sendingData()时调用的方法存在一些问题)
以下是相关代码:
主要活动。java
package com.example.texter;
import 安卓.content.ContentResolver;
import 安卓.content.Intent;
import 安卓.content.pm.PackageManager;
import 安卓.database.Cursor;
import 安卓.net.Uri;
import 安卓.os.Bundle;
import 安卓.os.CountDownTimer;
import 安卓.os.Handler;
import 安卓.view.View;
import 安卓.widget.AdapterView;
import 安卓.widget.ArrayAdapter;
import 安卓.widget.Button;
import 安卓.widget.EditText;
import 安卓.widget.ListView;
import 安卓.widget.Toast;
import 安卓x.appcompat.app.AppCompatActivity;
import 安卓x.core.app.ActivityCompat;
import 安卓x.core.content.ContextCompat;
import com.安卓.volley.Request;
import com.安卓.volley.RequestQueue;
import com.安卓.volley.Response;
import com.安卓.volley.VolleyError;
import com.安卓.volley.toolbox.StringRequest;
import com.安卓.volley.toolbox.Volley;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
private static MainActivity inst;
ArrayList<String> smsMessagesList = new ArrayList<String>();
ListView smsListView;
ArrayAdapter arrayAdapter;
Timer timer;
static String smssender;
Button stopButton;
Button startButton;
static String content;
public static MainActivity instance() {
return inst;
}
@Override
public void onStart() {
super.onStart();
inst = this;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
smsListView = (ListView) findViewById(R.id.SMSlist);
startButton = (Button) findViewById(R.id.button2);
stopButton = (Button) findViewById(R.id.stopbtn);
arrayAdapter = new ArrayAdapter<String>(this, 安卓.R.layout.simple_list_item_1, smsMessagesList);
smsListView.setAdapter(arrayAdapter);
// Todo : If Permission Is Not GRANTED
if(ContextCompat.checkSelfPermission(getBaseContext(), "安卓.permission.READ_SMS") == PackageManager.PERMISSION_GRANTED) {
// Todo : If Permission Granted Then Show SMS
refreshSmsInbox();
} else {
// Todo : Then Set Permission
final int REQUEST_CODE_ASK_PERMISSIONS = 123;
ActivityCompat.requestPermissions(MainActivity.this, new String[]{"安卓.permission.READ_SMS"}, REQUEST_CODE_ASK_PERMISSIONS);
Toast.makeText(this, "Please allow permissions to read SMS", Toast.LENGTH_SHORT).show();
}
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Intent intent = new Intent(MainActivity.this, MainActivity.class);
overridePendingTransition(0, 0); //to avoid blinking on refresh
startActivity(intent);
overridePendingTransition(0, 0);
}
}, 10000);
}
public void refreshSmsInbox() {
ContentResolver contentResolver = getContentResolver();
Cursor smsInboxCursor = contentResolver.query(Uri.parse("content://sms/inbox"), null, null, null, null);
int indexBody = smsInboxCursor.getColumnIndex("body");
int indexAddress = smsInboxCursor.getColumnIndex("address");
if (indexBody < 0 || !smsInboxCursor.moveToFirst()) return;
arrayAdapter.clear();
do {
String str = "SMS From: " + smsInboxCursor.getString(indexAddress) +
"\n" + smsInboxCursor.getString(indexBody) + "\n";
arrayAdapter.add(str);
} while (smsInboxCursor.moveToNext());
smsInboxCursor.moveToFirst();
if (smsInboxCursor.getString(indexAddress).equalsIgnoreCase("JX-JioSvc")) {
//NOW SEND TO SERVER
Toast.makeText(MainActivity.this,"Yes, JX-JioSvc", Toast.LENGTH_SHORT).show();
content = smsInboxCursor.getString(indexBody);
this.sendingData();
}
else {
Toast.makeText(MainActivity.this, "No, JX-JioSvc", Toast.LENGTH_SHORT).show();
}
}
public void updateList(final String smsMessage) {
arrayAdapter.insert(smsMessage, 0);
arrayAdapter.notifyDataSetChanged();
}
public void sendingData() {
String url = "---IP HERE---";
StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Toast.makeText(MainActivity.this, response.trim(), Toast.LENGTH_LONG).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("data", content);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
requestQueue.add(stringRequest);
}
public void startService(View view) {
startService(new Intent(this, Service.class));
}
public void stopService(View view) {
stopService(new Intent(this, Service.class));
}
}
服务。java
package com.example.texter;
import 安卓.content.Intent;
import 安卓.os.IBinder;
import 安卓.widget.Toast;
import 安卓x.annotation.Nullable;
public class Service extends 安卓.app.Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
MainActivity object = new MainActivity();
object.sendingData();
return START_STICKY;
}
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
}
# 1 楼答案
我们不应该创建MainActivity对象来调用API。相反,从主活动创建本地广播并注册广播。当您想要调用API时,只需将广播发送到MainActivity即可触发API。要创建本地广播,您可以查看下面的链接
How to use LocalBroadcastManager?