Delay application close and make an send a message
实际上我有一个 TCP 客户端,它 onStart 连接到服务器并将设备 IP 和号码发送给它,但现在我希望当应用程序关闭时( onDestroy )延迟几秒钟(重新打开的正确时间连接并发送另一条消息)并发送另一条消息,其中我说设备处于离线状态。
我已经尝试过使用 onDestroy 方法,但它可能很疯狂,而且很明显
那没有用(我尝试在 onDestroy 上做以下事情:
1 2 3 4 5 6 7 8 9 10 11 12 | protected void onDestroy() { new ConnectTask().execute(""); if (client != null) { client.sendMessage(trm +"OFFLINE"); } if (client != null) { client.stopClient(); } super.onDestroy(); server.onDestroy(); } |
这是我调用 TCP 客户端并发送启动消息的 MainActivity 代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 | 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"); } } }; } |
打开连接的正确命令是
当我用
发送消息时
FinalizingOperationsService.java 代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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(); } } |
像这样创建一个新服务,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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; } } |
并像这样在清单文件中定义此服务,
1 | <service android:name=". FinalizingOperationsService" android:stopWithTask="false"/> |
最后在你的主要活动的 onCreate 方法中启动服务
解释:
当应用程序被杀死或销毁时,服务的 onTaskRemoved() 方法被调用,因此在此方法中您可以执行最终操作以通知服务器并在操作完成后停止您的服务。希望对你有帮助。