Surya
Surya

Reputation: 124

Call intent from class other than MainActivity

First let me point out that this is my very first time coding an app, and even Java. I'm used to coding PHP and JS so please be kind

Im following the Google guides http://developer.android.com/training/basics/network-ops/connecting.html

Here's my Main Activity

package com.example.eerstetest;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {
public final static String EXTRA_MESSAGE = "com.example.eerstetest.MESSAGE";

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

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

public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class); 
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}

public void getUpdate(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class); 

    // see if there is a data connection
    ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        // fetch data
        //textView.setText("Network connection available.");
        String dataUrl = "http://www.myurl.com";
        new DownloadUpdate().execute(dataUrl);
    } else {
        // display error
        //textView.setText("No network connection available.");
        String message = "No network connection available.";
        intent.putExtra(EXTRA_MESSAGE, message);
        startActivity(intent);
    }
}
}

As you can see I have a sendMessage method which works, using the DisplayMessageActivity I also have the getUpdate method, wich calls the DownloadUpdate class which is in a seperate .java file

package com.example.eerstetest;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;

import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.util.Log;

// Uses AsyncTask to create a task away from the main UI thread. This task takes a 
// URL string and uses it to create an HttpUrlConnection. Once the connection
// has been established, the AsyncTask downloads the contents of the webpage as
// an InputStream. Finally, the InputStream is converted into a string, which is
// displayed in the UI by the AsyncTask's onPostExecute method.
public class DownloadUpdate extends AsyncTask<String, Integer, String> {
private static final String DEBUG_TAG = "HttpExample";
//private TextView textView;
public final static String EXTRA_MESSAGE = "com.example.eerstetest.MESSAGE";

@Override
protected String doInBackground(String... url) {

   // params comes from the execute() call: params[0] is the url.
   try {
       return downloadUrl(url[0]);
   } catch (IOException e) {
       return "Unable to retrieve web page. URL may be invalid.";
   }
}

// onPostExecute displays the results of the AsyncTask.
@Override
protected void onPostExecute(String result) {
   //textView.setText(result);
    Intent intent = new Intent(this, DisplayMessageActivity.class); 
    intent.putExtra(EXTRA_MESSAGE, result);
    startActivity(intent);
}

// Given a URL, establishes an HttpUrlConnection and retrieves
// the web page content as a InputStream, which it returns as
// a string.
private String downloadUrl(String myurl) throws IOException {
    InputStream is = null;
    // Only display the first 500 characters of the retrieved
    // web page content.
    int len = 500;

    try {
        URL url = new URL(myurl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        // Starts the query
        conn.connect();
        int response = conn.getResponseCode();
        Log.d(DEBUG_TAG, "The response is: " + response);
        is = conn.getInputStream();

        // Convert the InputStream into a string
        String contentAsString = readIt(is, len);
        return contentAsString;

    // Makes sure that the InputStream is closed after the app is
    // finished using it.
    } finally {
        if (is != null) {
            is.close();
        } 
    }
}

// Reads an InputStream and converts it to a String.
public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
    Reader reader = null;
    reader = new InputStreamReader(stream, "UTF-8");        
    char[] buffer = new char[len];
    reader.read(buffer);
    return new String(buffer);
}
}

I don't understand what I have to fill in for the context when calling the DisplayMessageActivity from here

To be complete, here is m manifest file

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.eerstetest"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.eerstetest.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.example.eerstetest.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.eerstetest.MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.eerstetest.MainActivity" />
    </activity>
    <activity
        android:name="com.example.eerstetest.DownloadUpdate"
        android:label="@string/title_activity_download_update" >
    </activity>
</application>

</manifest>

If there is anything additional I can provide, please let me know

Upvotes: 0

Views: 4310

Answers (3)

Shoshi
Shoshi

Reputation: 2254

i think u r calling DownloadUpdate from another class or activity as:

new DownloadUpdate().execute(params);

to solve the context problem in DownloadUpdate, create a constructor like:

public DownloadUpdate(Context context){
    this.context = context;
}

here this.context means your globally declared Context variable in DownloadUpdate class. then call DownloadUpdate as:

new DownloadUpdate(your_context).execute(params);

then use the context you have get in DownloadUpdate to create your intent. like:

@Override
protected void onPostExecute(String result) {
   //textView.setText(result);
    Intent intent = new Intent(context, DisplayMessageActivity.class); 
    intent.putExtra(EXTRA_MESSAGE, result);
    startActivity(intent);
}

Upvotes: 0

Anand
Anand

Reputation: 2885

pass the context as parameter like this :

new DownloadUpdate(MainActivity.this).execute(dataUrl);

add constructor in DownloadUpdate :

Context context;
public DownloadUpdate(Context context){
    this.context = context
}

and then use the context in your DownloadUpdate class as a global parameter and call intent using this

Intent intent = new Intent(DownloadUpdate.this, DisplayMessageActivity.class); 
intent.putExtra(EXTRA_MESSAGE, result);
context.startActivity(intent);

Upvotes: 1

SubbaReddy PolamReddy
SubbaReddy PolamReddy

Reputation: 2113

call like this:

Intent intent = new Intent(DownloadUpdate.this, DisplayMessageActivity.class); 
intent.putExtra(EXTRA_MESSAGE, result);
startActivity(intent);

Upvotes: 0

Related Questions