关于android:延迟应用程序关闭并发送消息

Delay application close and make an send a message

实际上我有一个 TCP 客户端,它 onStart 连接到服务器并将设备 IP 和号码发送给它,但现在我希望当应用程序关闭时( onDestroy )延迟几秒钟(重新打开的正确时间连接并发送另一条消息)并发送另一条消息,其中我说设备处于离线状态。

我已经尝试过使用 onDestroy 方法,但它可能很疯狂,而且很明显
那没有用(我尝试在 onDestroy 上做以下事情:

protected void onDestroy() {
    new ConnectTask().execute("");
    if (client != null) {
        client.sendMessage(trm +"OFFLINE");
    }
    if (client != null) {
        client.stopClient();
    }

    super.onDestroy();
    server.onDestroy();
}

这是我调用 TCP 客户端并发送启动消息的 MainActivity 代码:

public class MainActivity extends AppCompatActivity {
Server server;
static Client client;
settings Settings;
public static TextView terminale, indr, msg;
TextView log;
static TextView msgServer;
static String ipp;
static String trm;
static DataBaseHandler myDB;
allert Allert;
SharedPreferences prefs;
String s1 ="GAB Tamagnini SRL ?? 2017 \
" +
       "Via Beniamino Disraeli, 17,\
" +
       "42124 Reggio Emilia \
" +
       "Telefono: 0522 / 38 32 22 \
" +
       "Fax: 0522 / 38 32 72 \
" +
       "Partita IVA, Codice Fiscale \
" +
       "Reg. Impr. di RE 00168780351 \
" +
       "Cap. soc. a?? 50.000,00 i.v. \
" +"" +
       "REA n. RE-107440 \
" +
       "presso C.C.I.A.A. di Reggio Emilia";
ImageButton settings, helps, allerts, home;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Utils.darkenStatusBar(this, R.color.colorAccent);
    server = new Server(this);
    myDB = DataBaseHandler.getInstance(this);

    msg = (TextView) findViewById(R.id.msg);
    log = (TextView) findViewById(R.id.log_avviso);
    settings = (ImageButton) findViewById(R.id.impo);
    helps = (ImageButton) findViewById(R.id.aiut);
    allerts = (ImageButton) findViewById(R.id.msge);
    home = (ImageButton) findViewById(R.id.gab);
    terminale = (TextView) findViewById(R.id.terminal);
    indr = (TextView) findViewById(R.id.indr);
    msgServer = (TextView) findViewById(R.id.serverMSG);

    final Cursor cursor = myDB.fetchData();
    if (cursor.moveToFirst()) {
        do {
            indr.setText(cursor.getString(1));
            terminale.setText(cursor.getString(2));
            Client.SERVER_IP = cursor.getString(1);
            trm = cursor.getString(2);
        } while (cursor.moveToNext());
    }

    startService(new Intent(MainActivity.this,FinalizingOperationsService.class));

    WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
    ipp = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());

    startConnection.postDelayed(runnableConnection,5000);
    startMessage.postDelayed(runnableMessage,5500);

    cursor.close();
    server.Parti();

    home.setOnClickListener(new View.OnClickListener() {
                                int counter = 0;
        @Override
        public void onClick(View view) {
                                    counter++;
                                    if (counter == 10) {
                                        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                                        builder.setCancelable(true);
                                        builder.setMessage(s1);
                                        builder.show();
                                        counter = 0;
                                    }
        }
    });

    settings.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent impostazioni = new Intent(getApplicationContext(), settingsLogin.class);
            startActivity(impostazioni);
        }
    });

    helps.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent pgHelp = new Intent(getApplicationContext(), help.class);
            startActivity(pgHelp);
        }
    });

    allerts.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Server.count = 0;
            SharedPreferences prefs = getSharedPreferences("MY_DATA", MODE_PRIVATE);
            SharedPreferences.Editor editor = prefs.edit();
            editor.clear();
            editor.apply();
            msg.setVisibility(View.INVISIBLE);
            Intent pgAlert = new Intent(getApplicationContext(), allert.class);
            startActivity(pgAlert);
        }
    });

}

@Override
protected void onDestroy() {
    super.onDestroy();
    server.onDestroy();
}

public static class ConnectTask extends AsyncTask<String, String, Client> {

    @Override
    protected Client doInBackground(String... message) {

        client = new Client(new Client.OnMessageReceived() {
            @Override

            public void messageReceived(String message) {

                publishProgress(message);

            }
    });
        client.run();

        return null;
    }

    @Override
    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);

            msgServer.setTextColor(Color.parseColor("#00FF00"));
            msgServer.setText("ONLINE");

        Log.d("test","response" + values[0]);
    }
}

static Handler startConnection = new Handler();
static Runnable runnableConnection = new Runnable() {
    @Override
    public void run() {

        new ConnectTask().execute("");
    }
};

static Handler startMessage = new Handler();
static Runnable runnableMessage = new Runnable() {
    @Override
    public void run() {
        final Cursor cursor = myDB.fetchData();
        if (cursor.moveToFirst()) {
            do {
                Client.SERVER_IP = cursor.getString(1);
                trm = cursor.getString(2);
            } while (cursor.moveToNext());
        }
        if (client != null) {
            client.sendMessage(ipp +"#" + trm);
        }
    }
};

static Handler startMessageClose = new Handler();
static Runnable runnableMessageClose = new Runnable() {
    @Override
    public void run() {
        if (client != null) {
            client.sendMessage(trm +"IS OFFLINE");
        }
        }
    };

}

打开连接的正确命令是new ConnectTask().execute("");
当我用 if (client != null) { client.sendMessage(ipp +"#" + trm); }

发送消息时

FinalizingOperationsService.java 代码:

public class FinalizingOperationsService extends Service {

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

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d("FOService","Service Started");
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d("FOService","Service Destroyed");
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    Log.e("FOService","Service Ends");
    MainActivity.startConnection.removeCallbacks(MainActivity.runnableConnection);
    MainActivity.startConnection.postDelayed(MainActivity.runnableConnection,100);

    MainActivity.startMessageClose.removeCallbacks(MainActivity.runnableMessageClose);
    MainActivity.startMessageClose.postDelayed(MainActivity.runnableMessageClose,110);

    stopSelf();
    }
}


像这样创建一个新服务,

public class FinalizingOperationsService extends Service {

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

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.d("FOService","Service Started");
            return START_STICKY;
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            Log.d("FOService","Service Destroyed");
        }

        @Override
        public void onTaskRemoved(Intent rootIntent) {
            Log.e("FOService","Service Ends");
            // write server updation code here
            // after completing code perform stopself() to stop this service;
        }
    }

并像这样在清单文件中定义此服务,

<service android:name=". FinalizingOperationsService" android:stopWithTask="false"/>

最后在你的主要活动的 onCreate 方法中启动服务

startService(newIntent(getContext(),FinalizingOperationsService.class));

解释:
当应用程序被杀死或销毁时,服务的 onTaskRemoved() 方法被调用,因此在此方法中您可以执行最终操作以通知服务器并在操作完成后停止您的服务。希望对你有帮助。

相关讨论

  • 我只是尝试这样做,但似乎没有任何改变,我已经用 FinalizingOperationsService 代码更新了问题并更新了 MainActivity 你可以看看吗?
  • 我认为当应用程序关闭时您会丢失客户端的引用,您应该必须在服务中重新初始化客户端才能执行这些操作。
  • 等等,但我必须为 FinalizingOperationsService 创建一个新类吗?或者我可以在 MainActivity 中做到这一点?因为要重新初始化,我必须从 Main 重新复制所有异步方法
  • 最好创建一个单独的类来初始化您的客户端。
  • 实际上,我在 FinalizingOperationsService 中重新初始化了客户端,但应用程序仍然关闭而不发送消息,或者初始化只是立即关闭它的客户端......
  • 仍然与旧的日志相同,我的意思是其中没有新内容,也没有来自 FinalizingOperationsService 的日志
  • 让我们在聊天中继续这个讨论。

以上是关于android:延迟应用程序关闭并发送消息的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>