簡體   English   中英

Android通過后台服務啟動活動

[英]Android Starting Activity via Background Service

我的目標是讓UDP數據包接收應用程序從后台啟動時連續運行,當它收到有效數據包時,它必須處理消息並顯示它們。

經過一番研究,我做了以下幾點。

  1. Broadcast Receiver類 - 在啟動時啟動服務UP(mstart.java)。
  2. 用於監視UDP數據包的服務類(udp.java)。
  3. 顯示類以將消息顯示為文本(Rmsgs.java)。
  4. GlobalState.Java用於全局變量。

我寫了一個獨立的UDP應用程序與列表視圖,它工作正常。 因此,我知道這沒有問題。

當我編譯運行代碼服務啟動時啟動然后崩潰。 為了調試,我已經拿走了UDP數據包接收部分。 接收到數據包后的UDP類將生成兩個數組列表,並將其保存在Global類中,Display類將獲取它。

    This code is working now, I found mistake I have made and corrected it.

現在我必須修改以接收udp數據包。

AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.QUICKBOOT_POWERON"/>
<application
    android:name="com.mmm.rmsg.GlobalState"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MsgView"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
           <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <receiver android:enabled="true" android:exported="true"
        android:name=".mstart"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
    <service android:name=".udp"
      />
    </application>
<uses-permission android:name="android.permission.INTERNET"/>

廣播接收器類

 package com.mmm.rmsg;
 import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class mstart extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    Toast.makeText(context, "Intent detcted.", Toast.LENGTH_LONG).show();

    Intent pushIntent = new Intent(context, udp.class);
    context.startService(pushIntent);
  }

  }

服務類

  package com.mmm.rmsg;
  import android.app.Service;
  import android.content.Context;
  import android.content.Intent;
  import android.os.IBinder;
  import android.os.PowerManager;
  import android.widget.Toast;
  import java.util.ArrayList;

  import static android.os.PowerManager.PARTIAL_WAKE_LOCK;


  public class udp extends Service {

  private static final String LOG_TAG =udp.class.getSimpleName();


  GlobalState gs = (GlobalState)getApplication();

 @Override
 public IBinder onBind(Intent arg0){

    return  null;
}

@Override public int onStartCommand(Intent intent, int flags, int startId) {

    setWakeLock();
    Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();

    new Thread(new Server()).start();

   return START_STICKY;




}


private void setWakeLock(){


    PowerManager.WakeLock mWakeLock;
    PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
    mWakeLock=powerManager.newWakeLock(PARTIAL_WAKE_LOCK, LOG_TAG);
}

public class Server implements Runnable {

    @Override
    public void run() {

        ArrayList<String> list = new ArrayList<>();
        ArrayList<String> clist = new ArrayList<>();
        // here udp packets are recvd & processed into 2 list arrays

        list.add(0, "MAIN FAIL");
        list.add(1,"BOILER HEATER 20C");
        list.add(2, "COOLING NEED ATT");

        clist.add(0, "6");
        clist.add(1,"1");
        clist.add(2, "5");

        GlobalState gs = (GlobalState)getApplication();

          gs.setGmlist(list);
          gs.setGclist(clist);

        call();

    }

}

public void call() {


    Intent dialogIntent = new Intent(getBaseContext(), MsgView.class);
    dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(dialogIntent);

   }

  }

全球課程

   package com.mmm.rmsg;

  import java.util.ArrayList;
  import android.app.Application;

  public class GlobalState extends Application
  {
    private ArrayList<String> Gmlist = new ArrayList<>();
    private ArrayList<String> Gclist = new ArrayList<>();
    private boolean chk = true;
    private boolean cchk = true;



   public ArrayList<String> getGmlist() {

    chk = Gmlist.isEmpty();

    if(chk==true)
    {
        Gmlist.add(0,"No Calls");
    }

     return Gmlist;
  }

   public ArrayList<String> getGclist() {
      cchk = Gclist.isEmpty();

    if(cchk==true)
    {
        Gclist.add(0,"0");
    }

    return Gclist;
}

    public void setGmlist(ArrayList<String> Gmlit) {

        for (int i = 0; i < Gmlit.size(); i++) {
            this.Gmlist.add(i, Gmlit.get(i));
        }


  }

  public void setGclist(ArrayList<String> Gclit) {

    for (int i = 0; i < Gclit.size(); i++) {
        this.Gmlist.add(i, Gclit.get(i));
      }

     }

   }

顯示類

    package com.mmm.rmsg;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.ListView;
    import android.content.Context;
    import android.graphics.Color;
    import android.widget.ArrayAdapter;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import java.util.ArrayList;
    import java.util.Arrays;


    public class MsgView extends AppCompatActivity {

        ListView listView ;
        ArrayList<String> mlist = new ArrayList<>();
        ArrayList<String> plist = new ArrayList<>();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_msg_view);

            // Get ListView object from xml
            listView = (ListView) findViewById(R.id.list);

            GlobalState gs = (GlobalState) getApplication();

                mlist= gs.getGmlist();
                plist= gs.getGclist();



                String[] msgArray = mlist.toArray(new String[mlist.size()]);
                Arrays.toString(msgArray);
                String[] clrArray = plist.toArray(new String[plist.size()]);
                Arrays.toString(clrArray);


                listView.setAdapter(new ColorArrayAdapter(this, android.R.layout.simple_list_item_1, msgArray,clrArray));

        }



        public class ColorArrayAdapter extends ArrayAdapter<Object>{
            private String[] list;
            private String[] p;
            public ColorArrayAdapter(Context context, int textViewResourceId,
                             Object[] objects, Object[] obj) {
            super(context, textViewResourceId, objects);
            list = new String[objects.length];
            for (int i = 0; i < list.length; i++)
                list[i] = (String) objects[i];

            p = new String[objects.length];
                for (int i = 0; i < p.length; i++)
                p[i] = (String) obj[i];
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = (TextView)super.getView(position, convertView, parent);




        String c;
        for(int x=0; x< list.length; x++)
        {
            c=chk(x,p);

            if("R".equals(c) && position==x ) {
                view.setBackgroundColor(Color.RED);
            }
            else
            if("Y".equals(c) && position==x) {
                view.setBackgroundColor(Color.YELLOW);
            }
            else
            if("G".equals(c) && position==x) {
                view.setBackgroundColor(Color.GREEN);
           }

        }
            return view;
        }

    }


        public  String chk(int idx, String[] table){


    String res;
    if("6".equals(table[idx]) || "7".equals(table[idx])  || "8".equals(table[idx])) {
        res = "R";
    }
    else
    if("4".equals(table[idx])  || "5".equals(table[idx])) {
        res = "Y";
    }
    else
    if("1".equals(table[idx])|| "2".equals(table[idx]) || "3".equals(table[idx]) ) {
        res = "G";
    }
    else{
        res = "W";
    }



        return res;
    }


        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_msg_view, menu);
        return true;
    }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
            }

    return super.onOptionsItemSelected(item);
        }


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

        }
    }

你還沒有開始你的線程。 你可以這樣做:

Thread initBkgThread = new Thread(new Runnable() {

        public void run() {
            udp();
        }
    });
initBkgThread .start();

這是一個完整的代碼還是只是一些剪輯? 首先,你的text1沒有被初始化。

text1 = findViewById(R.id.<id_of_text_view_in_activity_calls_layout>)

要從您的服務開始活動,您應該創建您的意圖,如:

//Starting Smsgs 
Intent startAct = new Intent(context, Smsgs.class);
startAct.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(startAct);

您至少需要兩個線程,一個用於接收UDP數據包,另一個用於計算數據。 你需要像這樣修改你的udp()函數:

//Warning, I did not test this code, handle it like pseude-code. 
private void udp(){

            // ...
            // Wait to receive a datagram
            dsocket.receive(packet);

            Thread showMsg = new Thread(new Runnable() {

                public void run() {
                   // Convert the contents to a string,
                   String message = new String(buffer, 0, packet.getLength());
                   Intent intent = new Intent(this, Smsgs.class);
                   intent.putExtra("msg",message);
                   intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                   startActivity(intent);

                }

            });
            showMsg.start();
            // ...
}

並且不要忘記啟動另一個線程: initBkgThread.start()

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM