[英]Android: How to call a method from a Service
I am making an app which reads the SMS from the phone and sends SMS from a particular sender to a server.我正在制作一个应用程序,它从手机中读取短信并将短信从特定的发件人发送到服务器。 I want to have to app run in background using Service but its not working.
我想必须使用服务在后台运行应用程序,但它不起作用。 The app is crashing when I try to start the Service.
当我尝试启动服务时,应用程序崩溃了。
(If I play some music using Mediaplayer the Service works fine but I think there is some problem with the method calling when I try to run sendingData() when the Service starts) (如果我使用 Mediaplayer 播放一些音乐,则服务可以正常工作,但我认为在服务启动时尝试运行 sendData() 时调用的方法存在一些问题)
Here are the relevant code:以下是相关代码:
MainActivity.java MainActivity.java
package com.example.texter;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.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, android.R.layout.simple_list_item_1, smsMessagesList);
smsListView.setAdapter(arrayAdapter);
// Todo : If Permission Is Not GRANTED
if(ContextCompat.checkSelfPermission(getBaseContext(), "android.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[]{"android.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));
}
}
Service.java服务.java
package com.example.texter;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
import androidx.annotation.Nullable;
public class Service extends android.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();
}
}
We should not create a MainActivity object to call API.Instead create a Local broadcast from Main Activity and register for broadcast.When you want to call API,just send broadcast to MainActivity to trigger API.For creating local broadcast,you can check below link. We should not create a MainActivity object to call API.Instead create a Local broadcast from Main Activity and register for broadcast.When you want to call API,just send broadcast to MainActivity to trigger API.For creating local broadcast,you can check below link .
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.