有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    我们不应该创建MainActivity对象来调用API。相反,从主活动创建本地广播并注册广播。当您想要调用API时,只需将广播发送到MainActivity即可触发API。要创建本地广播,您可以查看下面的链接

    How to use LocalBroadcastManager?